gpt4 book ai didi

javascript - 通过冒泡触发父级上的点击事件

转载 作者:行者123 更新时间:2023-12-03 07:45:26 25 4
gpt4 key购买 nike

我想使用 dispatchEvent 在父容器上手动触发单击事件。事件冒泡似乎不起作用。

// trigger click event on parent container
parent.dispatchEvent(new MouseEvent("click", {
bubbles: true,
cancelable: true,
view: window,
clientX: 4,
clientY: 4
}));

...

child.addEventListener('click', function(e) {
alert('click')
}, false);

看这个 fiddle :

https://jsfiddle.net/o4j0cjyp/2/

最佳答案

事件冒泡或根本不冒泡。我知道冒泡的唯一方法是获取目标元素中的所有元素,并迭代集合,对所有元素、其中一些元素或您的情况需要的任何元素调度事件。这可能很糟糕,因为如果您不告诉事件不要冒泡,您很容易陷入无限循环。

实现目标的更好方法是使用事件委托(delegate),即使用公共(public)父元素作为事件监听器元素。然后,当事件发生时,检查事件目标,如果它是您想要的,则执行任何工作。

所以对于你的html

<div id="parent-container">
<div id="child-container">
this area has a click listener
</div>
</div>
<div id="click-info">No 'click' event yet.</div>
<div class="btn" id="trigger-parent-btn">
trigger 'click' event on parent container<br>
[ does not work ]
</div>
<div class="btn" id="trigger-child-btn">
trigger 'click' event directly on child container
</div>

我们可以在公共(public)父事件(在本例中为 <body> )上设置一个点击监听器,而不是在每个事件上设置事件监听器并尝试触发子事件或父事件。在那里我们可以测试目标元素是否是我们想要触发显示点击信息的三个元素之一,如果是,则显示信息。

var info = document.querySelector("#click-info");
document.body.addEventListener("click",function(event){
var target = event.target;
if(target.classList.contains("btn") || target.id=="child-container"){
info.innerHTML = 'Clicked at ' + event.clientX + ':' + event.clientY;
}
})
<div id="parent-container">
<div id="child-container">
this area has a click listener
</div>
</div>
<div id="click-info">No 'click' event yet.</div>
<div class="btn" id="trigger-parent-btn">
trigger 'click' event on parent container<br>
[ does not work ]
</div>
<div class="btn" id="trigger-child-btn">
trigger 'click' event directly on child container
</div>

关于javascript - 通过冒泡触发父级上的点击事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35226807/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com