stopPropagation原生事件vs javascript事件



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

效果很好。我正在添加事件处理程序,当我点击我的图像alert(2)而不触发链接处理程序alert(1)。奇怪的部分是,如果我除去的preventDefault, alert(1)仍然不火,但它遵循的链接。为什么stopPropagation阻止处理程序冒泡事件,但它需要preventDefault不跟随链接?

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

//编辑请先看演示再回答。我有两个不同元素的处理人员。尽管stopPropagation阻止父元素的处理程序被触发,但它并不阻止它跟随链接。但是阻止传播,不能阻止事件冒泡吗?它不会使父元素的事件无效吗?

//为什么处理程序alert(1)的事件无效,而链接后面的事件不无效?

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()是否存在,它都将触发。

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

你解释得很好。

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

传播行为是事件冒泡到父节点,阻止传播会阻止事件冒泡到父节点。这与跟随链接不同,因为跟随链接是与链接本身相关的东西,而不是附加到它的父链接,所以,它仍然在那里。

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

更新:

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

jQuery stopPropagation不工作时,应用于文本框内的锚

相关内容

  • 没有找到相关文章

最新更新