我为这个问题制作了这个测试代码:https ://jsfiddle.net/5phqm/1/
据我了解,如果 jQuerytriggerHandler()
阻止默认浏览器行为,则不会触发和处理本机 JavaScript 事件(在我的代码中也是如此),但无论如何都会触发addEventListener()
通过标签属性添加的内联事件!onclick=""
为什么会发生?我对浏览器中触发的事件有误解吗?
我为这个问题制作了这个测试代码:https ://jsfiddle.net/5phqm/1/
据我了解,如果 jQuerytriggerHandler()
阻止默认浏览器行为,则不会触发和处理本机 JavaScript 事件(在我的代码中也是如此),但无论如何都会触发addEventListener()
通过标签属性添加的内联事件!onclick=""
为什么会发生?我对浏览器中触发的事件有误解吗?
可以确认内联处理程序已运行,因为它是显式编码的:
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 ]();
whereonlyHandlers
是true
fortriggerHandle
和false
for .trigger
,因此triggerHandler
不执行 eg elem.click()
(而.trigger
执行)。因此,阻止了本机动作。
所以内联处理程序和本机操作是分开的东西,也是分开处理的。仅阻止本机操作.triggerHandler
。
我认为(但这是一个猜测,我简要查看了 jQuery 源代码,这可能是完全错误的)jQuery 通过调用类似的东西来检索附加到 jQuery.trigger.event 中元素的事件
$(elem).data("events");
然后决定是否开火/停止它们。内联事件无法以这种方式收集,因此无法停止。