5

我为这个问题制作了这个测试代码:https ://jsfiddle.net/5phqm/1/

据我了解,如果 jQuerytriggerHandler()阻止默认浏览器行为,则不会触发和处理本机 JavaScript 事件(在我的代码中也是如此),但无论如何都会触发addEventListener()通过标签属性添加的内联事件!onclick=""为什么会发生?我对浏览器中触发的事件有误解吗?

4

2 回答 2

2

可以确认内联处理程序已运行,因为它是显式编码的:

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 ]();

whereonlyHandlerstruefortriggerHandlefalsefor .trigger,因此triggerHandler不执行 eg elem.click()(而.trigger执行)。因此,阻止了本机动作。

所以内联处理程序和本机操作是分开的东西,也是分开处理的。仅阻止本机操作.triggerHandler

于 2011-11-30T15:57:47.663 回答
0

我认为(但这是一个猜测,我简要查看了 jQuery 源代码,这可能是完全错误的)jQuery 通过调用类似的东西来检索附加到 jQuery.trigger.event 中元素的事件

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

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

于 2011-11-30T12:33:38.887 回答