事件传播 - 是否可以为同一类型的事件向同一元素添加多个侦听器?

Event Propagation - Is it possible to add several listeners to the same element for the same type of event?

提问人: 提问时间:2/16/2023 更新时间:2/17/2023 访问量:273

问:

https://developer.mozilla.org/en-US/docs/Web/API/Event/stopImmediatePropagation

Event 接口的 stopImmediatePropagation() 方法防止 同一事件的其他侦听器被调用。

如果多个侦听器附加到同一元素的同一元素 事件类型,则按添加顺序调用它们。如果 stopImmediatePropagation() 在一次此类调用期间被调用,no 将调用剩余的侦听器。

我找到了这个方法,它让我感到困惑的是,同一事件有多个处理程序,对于同一个元素,甚至更糟stopImmediatePropagation()

你能给我举一个简单的例子吗?

最好在代码中

JavaScript DOM 处理 事件传播

评论

0赞 GoodMan 2/17/2023
这里有三个问题需要回答,才能完全理解这一点。1. 事件为什么要传播?2. 为什么要在一个元素上附加不同的处理程序?3. 为什么要在一个元素上为同一事件附加多个事件处理程序?

答:

0赞 Alohci 2/17/2023 #1

HTML5 规范在事件处理程序部分有一个很好的示例,它不仅显示了一个事件处理程序和多个附加到同一事件的同一元素的其他事件侦听器,而且还描述了它们运行的略微棘手的顺序。

<button id="test">Start Demo</button>
<script>
 var button = document.getElementById('test');
 button.addEventListener('click', function () { alert('ONE') }, false);
 button.setAttribute('onclick', "alert('NOT CALLED')"); // event handler listener is registered here
 button.addEventListener('click', function () { alert('THREE') }, false);
 button.onclick = function () { alert('TWO'); };
 button.addEventListener('click', function () { alert('FOUR') }, false);
</script>

它说,单击按钮后,“页面将显示四个警报,分别显示文本”ONE“、”TWO“、”THREE“和”FOUR”。

评论

0赞 2/17/2023
嗨 @Alohci +1 做了一些研究,我相信执行顺序仍有待讨论。我认为最好不要依赖顺序或每个事件只使用一个处理程序,对吧?
0赞 2/17/2023
在这个答案(最佳答案)中,他们保证顺序,例如@Alohci - stackoverflow.com/questions/28480982/......
0赞 Alohci 2/17/2023
@Coder23。是的,订单是有保证的。事件侦听器按其注册顺序执行。但请注意 HTML5 示例中的事件处理程序发生了什么。“onclick”函数被替换,但处理程序在侦听器集中的位置不会改变,因此“TWO”会在“THREE”之前发出警报。
0赞 2/18/2023
我现在明白@Alohci,预期的输出将是“ONE”、“THREE”、“TWO”(考虑到它尊重其在代码中的位置)、“FOUR”。因此,我们必须在添加事件的方式上保持一致性,即只使用语句,对吗?addEventListener()
0赞 Alohci 2/18/2023
@Coder23 - 只使用 addEventListener() 是有好处的。但是,只要您完全理解规则,就可以选择利用它们来发挥自己的优势。如果像我一样,你与一个庞大的开发团队合作,它可以帮助理解你的同事编写代码的后果。