Проверьте, инициировано ли событие человеком
У меня есть обработчик, прикрепленный к событию, и я бы хотел, чтобы он выполнялся, только если он запускается человеком, а не методом trigger(). Как я могу сказать разницу?
Например,
$('.checkbox').change(function(e){
if (e.isHuman())
{
alert ('human');
}
});
$('.checkbox').trigger('change'); //doesn't alert
Ответы
Ответ 1
Вы можете проверить e.originalEvent
: если он определил клик человека:
Посмотрите на скрипку http://jsfiddle.net/Uf8Wv/
$('.checkbox').change(function(e){
if (e.originalEvent !== undefined)
{
alert ('human');
}
});
мой пример в скрипке:
<input type='checkbox' id='try' >try
<button id='click'>Click</button>
$("#try").click(function(event) {
if (event.originalEvent === undefined) {
alert('not human')
} else {
alert(' human');
}
});
$('#click').click(function(event) {
$("#try").click();
});
Ответ 2
Более прямолинейно, чем указано выше:
$('.checkbox').change(function(e){
if (e.isTrigger)
{
alert ('not a human');
}
});
$('.checkbox').trigger('change'); //doesn't alert
Ответ 3
Я думаю, что единственный способ сделать это - передать дополнительный параметр в вызове trigger
в соответствии с документацией.
$('.checkbox').change(function(e, isTriggered){
if (!isTriggered)
{
alert ('human');
}
});
$('.checkbox').trigger('change', [true]); //doesn't alert
Пример: http://jsfiddle.net/wG2KY/
Ответ 4
Принятый ответ не помог мне. Это было 6 лет, и с тех пор jQuery сильно изменился.
Например, event.originalEvent
всегда возвращает true
с помощью jQuery 1.9.x. Я имею в виду, что объект всегда существует, но контент отличается.
Те, кто использует более новые версии jQuery, могут попробовать это. Работает на Chrome, Edge, IE, Opera, FF
if ((event.originalEvent.isTrusted === true && event.originalEvent.isPrimary === undefined) || event.originalEvent.isPrimary === true) {
//Hey hooman it is you
}
Ответ 5
Я бы подумал о возможности проверки положения мыши, например:
- Нажмите
- Получить положение мыши
- Перекрывает координаты кнопки
- ...
Ответ 6
Вы можете использовать onmousedown для обнаружения вызова щелчка мыши и триггера().
Ответ 7
Если у вас есть контроль над всем вашим кодом, никаких инопланетных вызовов $(input).focus()
, чем setFocus()
.
Использовать глобальную переменную - правильный способ для меня.
var globalIsHuman = true;
$('input').on('focus', function (){
if(globalIsHuman){
console.log('hello human, come and give me a hug');
}else{
console.log('alien, get away, i hate you..');
}
globalIsHuman = true;
});
// alien set focus
function setFocus(){
globalIsHuman = false;
$('input').focus();
}
// human use mouse, finger, foot... whatever to touch the input
Если какой-то иностранец все еще хочет называть $(input).focus()
с другой планеты.
Удачи или проверить другие ответы
Ответ 8
В настоящее время большинство браузеров поддерживают event.isTrusted:
if (e.isTrusted) {
/* The event is trusted: event was generated by a user action */
} else {
/* The event is not trusted */
}
Из документов:
Свойство isTrusted только для чтения интерфейса Event
является Boolean
верно, когда событие было сгенерировано действием пользователя, а неверно когда событие было создано или изменено скриптом или отправлено через EventTarget.dispatchEvent().