为什么jQuery的TriggerHandler()不能阻止内联事件?
-
26-10-2019 - |
题
我已经为一个问题做了此测试代码: http://jsfiddle.net/5phqm/1/
据我了解,如果JQuery的 triggerHandler()
防止默认浏览器行为,然后不会触发和处理本机JavaScript事件(这是正确的 addEventListener()
在我的代码中),但是内联事件,通过TAG的属性添加 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 ]();
在哪里 onlyHandlers
是 true
为了 triggerHandle
和 false
为了 .trigger
, ,因此 triggerHandler
不执行EG elem.click()
(然而 .trigger
做)。因此,防止本地行动。
因此,内联操作人员和本地动作是单独的事物,也可以单独处理。仅阻止本地行动 .triggerHandler
.
其他提示
我认为(但这是一个猜测,我简要介绍了jQuery源代码,这可能是完全错误的),jQuery通过调用类似的内容来检索jquery.trigger.vent中附加到元素的事件
$(elem).data("events");
然后决定是否开火/停止他们。无法以这种方式收集内联事件,因此不能停止它们。
不隶属于 StackOverflow