Почему triggerHandler () jQuery не предотвращает встроенные события? - PullRequest
5 голосов
/ 30 ноября 2011

Я сделал этот тестовый код для вопроса: http://jsfiddle.net/5phqm/1/

Насколько я понимаю, если jQuery triggerHandler() запрещает поведение браузера по умолчанию, то собственные события JavaScript не будут инициироваться и обрабатываться (и это верно для addEventListener() в моем коде), но встроенное событие добавляется через атрибут тега. onclick="" будет запущено в любом случае! Почему так происходит? Я что-то неправильно понимаю о событиях в браузере?

Ответы [ 2 ]

2 голосов
/ 30 ноября 2011

Можно подтвердить, что встроенные обработчики запускаются, потому что они явно закодированы :

handle = ontype && cur[ ontype ];
if ( handle && jQuery.acceptData( cur ) && handle.apply( cur, data ) === false ) {
    event.preventDefault();
}

, где ontype в этом случае "onclick". Поэтому он выбирает свойство onclick элемента и затем выполняет его. Этот фрагмент кода вызывается всегда, независимо от .trigger / .triggerHandler.

Однако собственные действия, такие как elem.click(), выполняются только внутри блока if :

if ( !onlyHandlers && !event.isDefaultPrevented() ) {
    // ...
    elem[ type ]();

, где onlyHandlers равно true для triggerHandle и false для .trigger, и поэтому triggerHandler не выполняется, например, elem.click() (тогда как .trigger делает). Таким образом, собственное действие предотвращено.

Таким образом, встроенные обработчики и собственные действия являются отдельными вещами и также обрабатываются отдельно. .triggerHandler.

предотвращает только собственные действия
0 голосов
/ 30 ноября 2011

Я думаю (но это предположение, я кратко рассмотрел исходный код jQuery, и это может быть совершенно неправильно), что jQuery извлекает события, связанные с элементами в jQuery.trigger.event, вызывая что-то вроде

   $(elem).data("events");

и затем решает, стрелять ли / останавливать их.Встроенные события не могут быть собраны таким образом, поэтому их нельзя остановить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...