Давайте сравним 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.
Подумайте об этом: http://stackoverflow.com/questions/3772537/triggerhandler-vs-trigger-in-jquery – tymeJV
Не могли бы вы точно определить причину? –
Метод .triggerHandler() не вызывает поведение события по умолчанию. иначе все почти то же самое. – MarmiK