Проверьте, инициировано ли событие человеком

У меня есть обработчик, прикрепленный к событию, и я бы хотел, чтобы он выполнялся, только если он запускается человеком, а не методом 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().