我为问题制作了此测试代码:http://jsfiddle.net/5phqm/1/
据我了解,如果jQuery的triggerHandler()
阻止了默认的浏览器行为,那么本机JavaScript事件将不会被触发和处理(对于我的代码中的addEventListener()
也是如此),但是内联事件,无论如何都会触发通过标记的属性onclick=""
添加的内容!为什么会这样?我是否误解了浏览器中触发的事件?
答案 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
true
为triggerHandle
而false
为.trigger
,因此triggerHandler
不执行,例如elem.click()
.trigger
(而.triggerHandler
确实如此)。因此,可以防止本机操作。
因此内联处理程序和本机操作是分开的事情,也是单独处理的。 {{1}}仅阻止本机操作。
答案 1 :(得分:0)
我认为(但这是猜测,我简要介绍了jQuery源代码,这可能是完全错误的)jQuery通过调用类似
的东西来检索附加到jQuery.trigger.event中元素的事件。 $(elem).data("events");
然后决定是否开火/停止它们。内联事件无法以这种方式收集,因此无法停止。