为什么jQuery的triggerHandler()不会阻止内联事件?

时间:2011-11-30 11:42:44

标签: javascript jquery eventtrigger

我为问题制作了此测试代码:http://jsfiddle.net/5phqm/1/

据我了解,如果jQuery的triggerHandler()阻止了默认的浏览器行为,那么本机JavaScript事件将不会被触发和处理(对于我的代码中的addEventListener()也是如此),但是内联事件,无论如何都会触发通过标记的属性onclick=""添加的内容!为什么会这样?我是否误解了浏览器中触发的事件?

2 个答案:

答案 0 :(得分:2)

可以确认内联处理程序是运行的,因为它是explicitly coded

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

ontype在这种情况下"onclick"。所以它获取元素的onclick属性然后执行它。无论.trigger / .triggerHandler是什么,都会调用此段代码。

然后,本地操作(例如elem.click())仅执行inside an if block

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

其中onlyHandlers truetriggerHandlefalse.trigger,因此triggerHandler不执行,例如elem.click() .trigger(而.triggerHandler确实如此)。因此,可以防止本机操作。

因此内联处理程序和本机操作是分开的事情,也是单独处理的。 {{1}}仅阻止本机操作。

答案 1 :(得分:0)

我认为(但这是猜测,我简要介绍了jQuery源代码,这可能是完全错误的)jQuery通过调用类似

的东西来检索附加到jQuery.trigger.event中元素的事件。
   $(elem).data("events");

然后决定是否开火/停止它们。内联事件无法以这种方式收集,因此无法停止。