gpt4 book ai didi

javascript - 我怎样才能模仿 stopImmediatePropagation() 的行为(不使用 jQuery)

转载 作者:数据小太阳 更新时间:2023-10-29 05:20:08 25 4
gpt4 key购买 nike

我正在为一个 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()

当我们循环遍历向我们注册的所有事件处理回调时,我们每次都会检查传播 bool 值:

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,还是因为他们可以想出一种巧妙的方法来做到这一点 - 我将不胜感激。

最佳答案

试着稍微改变一下你的函数:

event.stopImmediatePropagation = function () {
this.isImmediatePropagationEnabled = false;
this.cancelBubble = true;
};

那个“cancelBubble”标志是 IE 的东西,它应该防止事件冒泡到父 DOM 元素链。

关于javascript - 我怎样才能模仿 stopImmediatePropagation() 的行为(不使用 jQuery),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6446482/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com