Перевірте, чи подія викликана людиною


140

У мене до події доданий обробник, і я хотів би, щоб він виконувався лише в тому випадку, якщо він викликаний людиною, а не методом тригер (). Як визначити різницю?

Наприклад,

$('.checkbox').change(function(e){
  if (e.isHuman())
  {
    alert ('human');
  }
});

$('.checkbox').trigger('change'); //doesn't alert

Відповіді:


212

Ви можете перевірити 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();
});

1
@Nicola Це документується десь?
Šime Vidas

@ Час я не знаю, але я думаю, що це стандарт. дивіться тут: api.jquery.com/category/events/event-object
Nicola Peluchetti

@Nicola Я бачу, це річ jQuery. jQuery зберігає оригінальний об'єкт події всередині цього ресурсу. До речі, що ти не знаєш? Ви тільки що надали посилання на документацію:)
Šime Vidas

1
Схоже, ви також можете використовуватиevent.isTrigger
аволіва

1
@Anurag, я зараз стикався з тією ж проблемою. Схоже, jQuery заповнюється, originalEventколи подія запускається DOM.click(), але ви можете використовувати $($("#try")[0]).click();, що незграбно, але працює.
Даніель Гарретт

19

Більш прямим вперед, ніж вище, було б:

$('.checkbox').change(function(e){
  if (e.isTrigger)
  {
    alert ('not a human');
  }
});

$('.checkbox').trigger('change'); //doesn't alert

Це найкраща відповідь. Для пояснення см: stackoverflow.com/questions/10704168 / ...
jaredjacobs

3
Хоча це заманливо і, мабуть, затишно на практиці, зауважте, що розробники jQuery не бажають переходити isTriggerна публічний API станом на цей час .
Джон

7

Я думаю, що єдиний спосіб зробити це - передати додатковий параметр на triggerвиклик відповідно до документації .

$('.checkbox').change(function(e, isTriggered){
  if (!isTriggered)
  {
    alert ('human');
  }
});

$('.checkbox').trigger('change', [true]); //doesn't alert

Приклад: http://jsfiddle.net/wG2KY/


1
Ви можете ознайомитись із властивістю originalEvent об'єкта події: якщо подія не з’являється з клацанням, це не визначено
Nicola Peluchetti


1
Чомусь event.originalEvent не працював для мене (я просто продовжував отримувати 1), коли використовувався обробник Zepto. Тому я спробував рішення вище. Працював як шарм.
Larrydx

7

Прийнята відповідь не працювала для мене. Минуло 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
}

3

В даний час більшість браузерів підтримує 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 () .


0

Ви можете використовувати onmousedown для виявлення виклику клацання миші та тригера ().


Я не можу працювати за таким сценарієм: Іноді можна вибрати елементи сторінки за допомогою клавіші Tab. Наприклад, якщо я вибрав таким чином прапорець, я можу перевірити / зняти прапорець за допомогою клавіші пробілу. Або навіть відкрити дропдаун за допомогою клавіші зі стрілкою вниз.
Дієго Фаверо

0

Я б подумав про можливість, коли ви перевірите положення миші, наприклад:

  • Клацніть
  • Отримайте положення миші
  • Перекриває координати кнопки
  • ...

Я не можу працювати за таким сценарієм: Іноді можна вибрати елементи сторінки за допомогою клавіші Tab. Наприклад, якщо я вибрав таким чином прапорець, я можу перевірити / зняти прапорець за допомогою клавіші пробілу. Або навіть відкрити дропдаун за допомогою клавіші зі стрілкою вниз.
Дієго Фаверо

0

Якщо у вас є контроль над усім вашим кодом, без чужих дзвінків, $(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()з іншої планети. Удачі або перевірити інші відповіді


Це лише заважає людям телефонувати setFocus()- це не заважає людям запускати фокус події. Якщо setFocus()взагалі не писати, це також заважатиме людям телефонувати, тому я не бачу користі. Насправді люди все-таки могли зателефонувати $('input').focus()і пропустити це.
Роб

уау, перший раз у мене хтось коментує відразу після того, як я відповів на питання, я
оновлю

Якщо ви працюєте в закритому середовищі, де немає сценаріїв інших сторін, це працювало б у досконалому світі. Однак більшість практичних додатків призначені для клієнтських сайтів, на яких додані всілякі плагіни та сценарії, які дуже добре можуть викликати фокус. Одне, що може допомогти в цьому, - це обернути свій код (і будь-який код, який потребує виклику цієї функції) у такій масштабній функції, як ця: (function(){/*your code here*/})();Це дозволить захистити функцію setFocus від виклику, а булева зміна зовнішніх скриптів.
Ксандор
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.