stopPropagation native event vs javascript event
我在这里回答了一个问题,我偶然发现了一个奇怪的行为。检查这个演示
它工作得很好。我正在添加事件处理程序,当我单击alert(2),不触发链接处理程序alert(1)。奇怪的是,如果我移除preventdefault,alert(1)仍然不启动,但它遵循链接。为什么stoppropagation会阻止处理程序使事件冒泡,但它需要preventdefault不跟踪链接?
这纯粹是出于教育目的。我只是想知道发生了什么。
//编辑请在回答之前查看演示。我有两个不同元素的处理程序。尽管stoppropagation阻止父元素的处理程序激发,但它不会阻止它跟踪链接。但不停止传播,防止它的事件冒泡吗?它不是使父元素的事件无效吗?
//为什么处理程序警报(1)的事件无效,而不是链接的以下内容?
- 不,我读过这篇文章。我真的把它贴在我说的答案上了。请看演示。
- 我认为那个问题很好地回答了你的问题。preventDefault和stopPropagation做不同的事情。preventDefault停止浏览器的操作,其中stopPropegation阻止事件的进行。
- 是的,我同意,但是,你说"StopRopeation阻止事件向前推进",那么为什么它到达链接标签并跟踪链接?
- 嗯,不是吗?如果单击图像(小且在左上角断开)。你只会看到2,而不是1。
- 我没说是的。我知道我的例子是什么,这就是它困扰我的原因。当它不发出警报时,为什么它会跟踪链接(1)?它的工作方式与警报一样,但与以下链接不一样
javascript中的所有事件都会在最外层的元素上触发,然后在它的祖先中的每个元素上再次触发,直到它到达body。这样,事件首先在你的img上发生,然后再次在你的a上发生,因为你的img在a内。
如果不需要这种行为,那就是为什么您要使用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()是什么,它都会着火。
- "All events in Javascript fire on the outermost element interacted with"实际上不是这样。参见addEventListener中的useCapture可选标志。可以将事件设置为在发送到DOM树中元素下的元素之前命中元素。
- 随着useCapture的出现,这一事件仍在冒泡。它从最外层的元素一直向上冒泡,寻找useCapture = true事件,然后再对useCapture = false进行一次传递。请看这个小提琴:jsfiddle.net/af6au。
- 这就是我在岗位上所说的。既然stoppropagation()在这一点上是明确的,为什么它会跟踪链接(尽管它不发出警报(1))?
- stopPropagation对链接是否指向您的浏览器没有任何正面或负面影响。这完全由preventDefault或return false处理。
- 是的,但是为什么?由于气泡停止并停止传播,是什么触发了链接的后续操作?
- 是的,但是如果在捕获事件中调用stopPropagation,它不会传播到不使用捕获的事件。这就是我的观点。
- 这回答了我的问题。谢谢您。你能为以后的学习提供参考吗?
- 并非所有事件类型都有气泡(传播):stackoverflow.com/a/5575576/613004
How come that stopPropagation, prevents the handler from bubbling the
event, but it needs preventDefault to not follow the link?
你解释得很好。
正在遵循链接的默认行为。阻止默认值是阻止它被跟踪。
传播行为是事件向父级冒泡,防止传播停止向父级冒泡。这与跟踪链接不同,因为跟踪链接是与未附加到其父链接的链接本身相关的,因此它仍然存在。
如果我没记错的话,我会告诉jquery两者都要做。
更新:
我看到您正在将处理程序与以下链接区分开来,基于此,我认为这是您的答案:
jquery stoppropagation在应用于锚定内的文本框时不工作
- 很抱歉,如果StopRopeation阻止事件到达父级,则意味着它不应到达要跟踪的链接标记。我错过了什么?
- 这就是发生在我身上的事。在你的小提琴中,至少在Chrome中,当我评论PreventDefault时,如果我单击图像占位符(那里没有真正的图像),我只得到警报2,如果我单击链接的其余部分,我只得到警报1
- 父级是链接。单击img是一个适当的事件。
- 检查更新的答案。
- 是的,这回答了我的问题。但是只有上票。核子首先回答。