JavaScript: 如何启用 stopPropagation?

15

使用object.stopPropagation()可以阻止事件冒泡,但如何重新启用它呢?

在JavaScript中是否有预定义的函数类似于object.startPropagation

编辑:

问题在于JS会记住如果您单击"object",则始终停止事件冒泡,即使我不想要它,所以我想停止它:

document.getElementById("object").onclick = function(e){
    if(e && e.stopPropagation) {
        e.stopPropagation();
    } else {
          e = window.event;
          e.cancelBubble = true;
    }
}

你能添加更多信息吗?比如说你想要实现什么目标。如果你已经调用了停止,我看不出有必要再启动它。 - djdd87
当你说“即使我不想要它”,在什么情况下你不想要它?你需要设置一些变量来表示这些情况,然后在处理程序中检查该变量。如果您实际上发布了您的代码而不是选择另一个解决方案,那将会很有帮助。 - Kelvin
1个回答

27

它根本不记住值。每次触发 onclick 时,事件 e 都是新的。问题在于你总是取消事件冒泡:

if(foo) {
    e.stopPropagation();
} else {
    e.cancelBubble = true;
}
  • e.stopPropagation是W3C的方法,用于阻止事件冒泡。
  • e.cancelBubble是微软用来防止事件冒泡的方法。

它们本质上是相同的。因此,每次都会取消事件冒泡。更多信息请参见这里

您需要更改方法,以便仅在满足特定条件时才取消事件冒泡:

document.getElementById("object").onclick = function(e) {

    if(e && e.stopPropagation && someCriteriaToStopBubbling === true) 
    {
        e.stopPropagation();
    } 
    else if (someCriteriaToStopBubbling === true)
    {
          e = window.event;
          e.cancelBubble = true;
    }
}

更新: 请注意,在您当前的代码中,如果浏览器支持stopPropagationif (e && e.stopPropagation)将始终为真。如果进入第二个大括号用于cancelBubble,它将不记住上一次设置的值。请参见此fiddle

基本上,总结一下,您的代码会在每次点击后都取消传播。您必须在函数中放置一些条件来确定是否取消元素层次结构中的传播。


我测试过并记得,事件冒泡取消是在由另一个事件触发的函数内部。当我点击其他对象时,事件冒泡仍然被取消,并且我还在函数内部放置了一个警报,因为它记得如果您点击“对象”则启动该函数,但我没有启动事件冒泡函数的父函数,也许我不理解某些东西,但这就是我在这里的经验 :)。但是您的解决方案是正确的,我可以在那里放置一些IF ELSE语句,希望它能正常工作 :)。 - Adam Halasz
@CIRK - 你做错了什么,因为它不会记住,除非你正在执行一些与你提供的代码不同的代码。在这里看:http://jsfiddle.net/DgwSA/。每次你点击那个例子中的按钮,cancelBubble总是为false。我已经添加了一个更新,试图让你的错误更加明显。 - djdd87
请查看此链接 -> http://jsfiddle.net/DgwSA/1/。onclick已更改,取消冒泡也是如此,但是如果您警告e.cancelbubble将会给您错误的结果,但在我的项目中也停止了事件处理。 - Adam Halasz
通过我的上一个问题,我通过将 onclick 函数更改为其他内容来解决了问题,但非常感谢您的答案,您应该是正确的,因为您所说的是合乎逻辑的,但这里似乎有些问题 :D - Adam Halasz
@GenericTypeTea 看起来它确实记住了 e.stopPropagation 设置,无论每次事件是否不同。 - LaserBeak

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接