我在SO回答一个问题,我偶然发现了一个奇怪的行为。检查这个演示
效果很好。我正在添加事件处理程序,当我点击我的图像alert(2)
而不触发链接处理程序alert(1)
。奇怪的部分是,如果我除去的preventDefault, alert(1)
仍然不火,但它遵循的链接。为什么stopPropagation阻止处理程序冒泡事件,但它需要preventDefault不跟随链接?
这纯粹是出于教育原因。我只是想知道发生了什么。
//编辑请先看演示再回答。我有两个不同元素的处理人员。尽管stopPropagation阻止父元素的处理程序被触发,但它并不阻止它跟随链接。但是阻止传播,不能阻止事件冒泡吗?它不会使父元素的事件无效吗?
//为什么处理程序alert(1)的事件无效,而链接后面的事件不无效?
Javascript中的所有事件触发与之交互的最外层元素,然后再次触发每个元素在它的祖先,直到它到达body
。通过这种方式,事件首先在img
上触发,然后在a
上再次触发,因为img
在a
内部。
如果不需要这种行为,那就是为什么要使用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不工作时,应用于文本框内的锚