我正在研究Javascript库的事件处理代码,我正在尝试实现类似于stopImmediatePropagation()的东西,它也适用于IE 6。
事件处理当前的工作方式是,我们的事件处理代码向对象注册,然后用户使用我们的事件处理程序注册所有事件。
我尝试模拟stopImmediatePropagation()的第一种方法是简单地将该方法添加到事件中(如果它尚不存在):
if (event != null && event.isImmediatePropagationEnabled == null) {
event.stopImmediatePropagation = function () {
this.isImmediatePropagationEnabled = false;
};
event.isImmediatePropagationEnabled = true;
event.isImmediatePropagationStopped = function () {
return !this.isImmediatePropagationEnabled;
};
}
当调用用户的事件处理程序回调时,它们将被传入我们获得的同一事件对象中。如果他们愿意,他们可以在事件上调用stopImmediatePropagation()。
当我们循环遍历我们注册的所有事件处理回调时,我们每次检查传播布尔值:
given some event
for [all the callbacks] {
if (event != null &&
event.isImmediatePropagationStopped != null &&
event.isImmediatePropagationStopped()) {
stopPropagation = true;
break;
}
execute the callback, passing in the event
}
这在某些浏览器中效果很好。因为事件仍然存在,即使我们的事件处理代码退出并且事件冒泡到下一个元素,一旦我们的事件处理代码再次被命中,isImmediatePropagationStopped属性仍然存在,因此不再执行回调(向我们注册)
在Internet Explorer中(即使在8中),这不起作用。在同一个元素上,事情很好;但是一旦事件冒泡,就好像生成了一个全新的事件对象,我们失去了isImmediatePropagationStopped属性。这意味着我们无法检查用户是否关闭了传播。
所以我的问题是,有没有人对如何做到这一点有任何想法?我知道jquery管理一个类似的壮举(http://bugs.jquery.com/ticket/3355),但他们也是这样做的 - 将它存储在对象的额外数据中。我不知道的是对象的非持久性如何不会像对待我一样伤害它们。 (由于各种原因,使用jquery本身不是一个选项)
如果有人有任何见解 - 或者由于我对Javascript的了解比我更多,或者因为他们可以想到一个简洁的方法来做到这一点 - 我会非常感激。谢谢!
答案 0 :(得分:6)
尝试稍微更改一下您的功能:
event.stopImmediatePropagation = function () {
this.isImmediatePropagationEnabled = false;
this.cancelBubble = true;
};
“cancelBubble”标志是IE的东西,它应该阻止事件冒泡父DOM元素链。