📅  最后修改于: 2023-12-03 15:31:12.542000             🧑  作者: Mango
stopPropagation()
方法是 Event
接口的一部分,它可以阻止事件的进一步传播(方向是从子元素到父元素)。
在事件被触发后,事件会从目标元素开始向上冒泡,一直到 window 对象为止。如果在任何节点上调用了 stopPropagation()
方法,则事件将不再传播。
event.stopPropagation();
无。
无。
HTML 代码:
<body>
<div id="outer">
<div id="inner"></div>
</div>
</body>
JavaScript 代码:
var outer = document.getElementById("outer");
var inner = document.getElementById("inner");
inner.addEventListener("click", function(event) {
console.log("Inner clicked");
event.stopPropagation();
});
outer.addEventListener("click", function(event) {
console.log("Outer clicked");
});
结果: 如果单击 inner 元素,则控制台会显示 “Inner clicked”。 如果单击 outer 元素,则控制台会显示 “Inner clicked” 和 “Outer clicked”。
如果未调用 stopPropagation()
方法,则控制台将显示 “Inner clicked”、“Outer clicked”。 这是因为事件被传递到了 outer 元素。
以下是阻止事件传播的常见用例:
例如,有一个外部 div 和坐落在其中的内部 div。当在内部 div 上点击时,我们希望仅执行内部 div 上的事件处理程序,而不是触发外部 div 上的事件处理程序。
var outer = document.getElementById("outer");
var inner = document.getElementById("inner");
inner.addEventListener("click", function(event) {
console.log("Inner clicked");
event.stopPropagation();
});
outer.addEventListener("click", function(event) {
console.log("Outer clicked");
});
在自定义弹出式菜单中,菜单可能包含子元素。该菜单应在单击菜单元素外的任意区域时关闭。但是,这意味着我们要为整个文档添加单击事件监听器。
为了避免在单击菜单元素时关闭,我们可以在菜单元素上添加事件侦听器并阻止传播。这将使在菜单元素上点击时不触发文档上的任何单击事件。
var menu = document.getElementById("menu");
document.addEventListener("click", function(event) {
if (!menu.contains(event.target)) {
menu.classList.remove("visible");
}
});
menu.addEventListener("click", function(event) {
event.stopPropagation();
});
上面代码中,我们为文档添加了单击事件侦听器,以关闭弹出菜单。 然后我们为菜单元素添加了一个单击事件监听器,并在其上调用 stopPropagation()
方法。 这样,当我们在菜单上单击时,单击事件不会触发文档上的单击事件监听器,并且菜单不会被关闭。