关于jquery:stopPropagation原生事件vs javascript事件

stopPropagation native event vs javascript event

本问题已经有最佳答案,请猛点这里访问。

我在这里回答了一个问题,我偶然发现了一个奇怪的行为。检查这个演示

它工作得很好。我正在添加事件处理程序,当我单击alert(2),不触发链接处理程序alert(1)。奇怪的是,如果我移除preventdefault,alert(1)仍然不启动,但它遵循链接。为什么stoppropagation会阻止处理程序使事件冒泡,但它需要preventdefault不跟踪链接?

这纯粹是出于教育目的。我只是想知道发生了什么。

//编辑请在回答之前查看演示。我有两个不同元素的处理程序。尽管stoppropagation阻止父元素的处理程序激发,但它不会阻止它跟踪链接。但不停止传播,防止它的事件冒泡吗?它不是使父元素的事件无效吗?

//为什么处理程序警报(1)的事件无效,而不是链接的以下内容?


javascript中的所有事件都会在最外层的元素上触发,然后在它的祖先中的每个元素上再次触发,直到它到达body。这样,事件首先在你的img上发生,然后再次在你的a上发生,因为你的imga内。

如果不需要这种行为,那就是为什么您要使用stopPropagation来防止它在链上冒泡。在jquery中,很容易检查事件的起源元素,因此在某些情况下可以使用event.target忽略它。

1
2
3
if (e.target == this) {
  // run code only when this element is the originator of the event
}

当一个点击事件被触发时,基本上有两个纹理,即javascript事件和本机事件。如果本机事件不是preventDefault()return false某个地方,则无论stopPropagation()是什么,它都会着火。


How come that stopPropagation, prevents the handler from bubbling the
event, but it needs preventDefault to not follow the link?

你解释得很好。

正在遵循链接的默认行为。阻止默认值是阻止它被跟踪。

传播行为是事件向父级冒泡,防止传播停止向父级冒泡。这与跟踪链接不同,因为跟踪链接是与未附加到其父链接的链接本身相关的,因此它仍然存在。

如果我没记错的话,我会告诉jquery两者都要做。

更新:

我看到您正在将处理程序与以下链接区分开来,基于此,我认为这是您的答案:

jquery stoppropagation在应用于锚定内的文本框时不工作