问题 在javascript事件中,如何确定已调用stopPropagation()?


如果 e.preventDefault() 被称为,可以看到反映在 e.defaultPrevented 方法。

是否有类似的财产 e.stopPropagation()?如果没有,如何确定?


3280
2017-08-31 15:50


起源

第1步: w3.org/TR/DOM-Level-3-Events/#webidl-events-Event - Šime Vidas
所以你说如果活动在 CAPTURING PHASE 然后 stopPropagation() 被称为? - cc young
@young不,那是无关的......我甚至不确定所有的浏览器都会实现捕获阶段。 - Šime Vidas


答案:


我没有通过jQuery查看他们的方法,但似乎你可以覆盖 stopPropagation 基础上的方法 Event 对象,设置一个标志,然后调用重写的方法。

就像是:

var overriddenStop =  Event.prototype.stopPropagation;
Event.prototype.stopPropagation = function(){
    this.isPropagationStopped = true;
    overriddenStop.apply(this, arguments);
}

7
2017-08-31 16:06



我担心这是一个 馊主意 - Šime Vidas
你也许是对的。非常偷偷摸摸的实施方式,所以它是无形的下游。这可能会奏效!当我的大脑工作时,需要在早晨进行攻击。 - cc young
@Šime - 我同意。我认为这不像是一个“扩展”,因为它没有向Event类,albiet实例变量添加新方法。那么你会同意这里最好的方法是创建一个事件对象包装器吗? - Josiah Ruddell
@Josiah嗯,不要亲自制作一个 :) 我不想浪费时间处理这些低级别的事情。那里有足够的活动库...... - Šime Vidas
这有助于我调试代码中某个事件停止冒泡的位置。原来是bootstrap :)谢谢! - PSWai


不,没有。

我可以告诉,因为jQuery的 isPropagationStopped() method不在内部使用任何浏览器API,而是手动实现此功能。 (如果浏览器中有这样的功能 - 内置 - jQuery会使用它而不是手动执行。)

所以,在jQuery中,一个新的事件对象将获得这个属性(继承):

isPropagationStopped: returnFalse

然后,当你调用 stopPropagation() 在该事件对象上,jQuery将手动更改此属性:

stopPropagation: function() {
    this.isPropagationStopped = returnTrue;
    ...
}

returnFalse 和 returnTrue 是返回的功能 false 和 true 分别。


5
2017-08-31 16:04



哇,感谢您查看jQuery代码 - 我真的觉得这就是发生的事情。 - cc young


在IE中,您可以查看酒店 e.cancelBubble 检查原生停留。其他浏览器没有此功能。

但是,您可以自己跟踪它。由于它的性质,你无法在任何地方检查它,除了在停止传播本身的同一个处理程序中(事件不会冒泡,更多的处理程序不会被调用),所以我可以'想象一下有必要的情况。你想做什么?

编辑:我认为你最初使用的是jQuery。对于那些: 你可以使用 e.isPropagationStopped() 方法,它将检查传播是否已从jQuery停止。如果传播本地停止,这将无法分辨。


0
2017-08-31 16:25



看到 stackoverflow.com/questions/7257581/... 对于上下文。实质上 change 没有被调用,需要自己启动它 - cc young
如果您查看链接,请使用 dispatchEvent()  - 你是对的 - 这个问题已经不在了 - cc young
我懂了。当您手动触发事件时,事件仍会正确冒泡,因此他们应该遵守 .stopPropagation() 已经。 - Owen