2

Щелкните элемент, используя triggerHandler() работы:Почему jQuery triggerHandler() работает, но trigger() нет?

$element = $('#gwt-debug-location-pill-edit-div:visible'); 
$element.triggerHandler('click'); 

Но, нажав на него с помощью trigger(), не:

$element.trigger('click'); 

Почему?


Чтобы повторить это (в Firefox и Chrome):

  • Перейти к https://adwords.google.com/select/home, и войти, используя свои учетные данные
  • Инструменты и Планировщик Анализ -> Ключевое слово
  • Expand «Введите или загрузить ключевые слова, чтобы увидеть, как они выполняются »
  • Используя консоль браузера, попробуйте щелкнуть по блоку местоположений (отмечен красным на скриншоте ниже) с помощью двух методов выше (вам нужно будет ввести jQuery на страницу. Я использовал jQuerify, чтобы сделать это)

enter image description here

+0

Подумайте об этом: http://stackoverflow.com/questions/3772537/triggerhandler-vs-trigger-in-jquery – tymeJV

+0

Не могли бы вы точно определить причину? –

+0

Метод .triggerHandler() не вызывает поведение события по умолчанию. иначе все почти то же самое. – MarmiK

ответ

19

Давайте сравним jQuery.fn.trigger and jQuery.fn.triggerHandler:.

trigger: function(type, data) { 
    return this.each(function() { 
     jQuery.event.trigger(type, data, this); 
    }); 
}, 
triggerHandler: function(type, data) { 
    var elem = this[0]; 
    if (elem) { 
     return jQuery.event.trigger(type, data, elem, true); 
    } 
} 

Единственным отличием является четвертый аргумент, true, данные jQuery.event.trigger с triggerHandler.

Глядя на jQuery.event.trigger, the argument is called onlyHandlers, и среди прочего, the documentation of triggerHandler отмечает, что:

  • Метод .triggerHandler() не вызывает поведение по умолчанию события происходят (например, формы представления).

Мы можем видеть where the default behaviour is actually triggered:

// If nobody prevented the default action, do it now 
if (!onlyHandlers && !event.isDefaultPrevented()) { 

В случае, onlyHandlers ложна (trigger()), и ни один обработчик событий не остановил событие по умолчанию выполняется действие по умолчанию, то будет выполняться.

С учетом onlyHandlers (triggerHandler()) этого никогда не будет.

Итак, для trigger() случае, он заканчивает выполнение click() на целевом элементе, который вызывает изменение состояния правильно, но выясняется, что в обоих trigger() и triggerHandler() случаях, щелчок был уже правильно уволили в the loop through the eventPath above:

// Native handler 
handle = ontype && cur[ ontype ]; 
if (handle && jQuery.acceptData(cur) && handle.apply && handle.apply(cur, data) === false) { 

trigger('click') Так заканчивается щелкнув элемент дважды (!) - предположительно потому, что click() не возвращает false, поэтому действие по умолчанию никогда не предотвращается, тогда как triggerHandler('click') делает это только один раз.

Это можно проверить, пройдя по методу jQuery.event.trigger с инспектором и осмотрев селектор, затем снова закройте.

Вопрос в том, что мы ожидаем от этого; кажется странным, что триггер срабатывания в противном случае может вызвать двойные триггеры в случае реакции только с DOM.

+0

+1 действительно хороший ответ. – TecHunter

 Смежные вопросы

  • Нет связанных вопросов^_^