0

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

它工作得很好。我正在添加事件处理程序,当我单击图像时我 alert(2)没有触发链接处理程序alert(1)。奇怪的是,如果我删除了 preventDefault,alert(1)仍然不会触发,但它遵循链接。为什么 stopPropagation 会阻止处理程序冒泡事件,但它需要 preventDefault 才能不遵循链接?

这纯粹是出于教育原因。我只是想了解发生了什么。

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

//为什么处理程序alert(1)的事件无效但链接的following没有?

4

2 回答 2

2

Javascript 中的所有事件都在与之交互的最外层元素上触发,然后在其祖先中的每个元素上再次触发,直到到达body. 以这种方式,事件首先在您身上触发img,然后再次在您身上触发,a因为您imga.

如果不需要这种行为,这就是为什么你会使用stopPropagation它来防止它在链上冒泡。在 jQuery 中,很容易检查是哪个元素引发了事件,因此在某些情况下可以使用event.target忽略它。

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

当点击事件被触发时,基本上有两个脉络,Javascript 事件和本机事件。如果本机事件不在preventDefault()return false某处,它将触发,无论任何stopPropagation().

于 2013-06-12T23:15:19.043 回答
1

为什么 stopPropagation 会阻止处理程序冒泡事件,但它需要 preventDefault 才能不遵循链接?

嗯,你解释的很好。

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

传播行为是将事件冒泡到父级,防止传播停止对父级的冒泡。这与跟随链接不同,因为跟随链接是与链接本身相关的东西,而不是附加到其父级,所以它仍然存在。

return false;如果我没记错的话告诉 jQuery 两者都做。

更新:

我看到你正在区分处理程序和链接,基于此,我认为这就是你的答案:

jQuery stopPropagation 在应用于锚点内的文本框时不起作用

于 2013-06-12T23:14:54.460 回答