gpt4 book ai didi

javascript - 事件委托(delegate): Affecting more elements than it should

转载 作者:行者123 更新时间:2023-11-28 00:06:28 29 4
gpt4 key购买 nike

我正在学习事件委托(delegate),但遇到了问题。

一开始我做初稿的时候,如果点击只会删除文字,不会删除按钮,所以我修改了它。后来,当点击容器div时,它删除了整个内容,所以我再次更改它。

现在它是功能性的,但在我看来,它可以写得更通用(不需要添加类名,只需添加容器的id)并且以更有效的方式,我觉得还有更多代码比应有的要多。

还有一件事:它应该与动态添加的元素一起使用。

任何帮助将不胜感激!

function getTarget(e) {
return e.target;
}

function remove(e) {
var target = getTarget(e);
target.parentNode.removeChild(target);
}

function remove1(e) {
var target = getTarget(e);
var parent = target.parentNode;
parent.parentNode.removeChild(parent);
}

document.getElementById("contenedor").addEventListener("click", function (e) {
if (e.target && e.target.nodeName === "DIV" && e.target.classList.contains("bot")) {
remove(e);
}
if (e.target && e.target.nodeName === "SPAN") {
remove1(e);
}
document.getElementById("parrafo").textContent = "Hice click en";
});
<!DOCTYPE html>
<html>
<head>
</head>
<body>
<div id="contenedor">
<div class="bot" id="boton" style="width:200px; height:50px; background-color: red"><span>asdasd</span></div>
<br>
<div class="bot" id="boton1" style="width:200px; height:50px; background-color: red"><span>asdasd</span></div>
<br>
<div class="bot" id="boton2" style="width:200px; height:50px; background-color: red"><span>asdasd</span></div>
<br>
<div class="bot" id="boton3" style="width:200px; height:50px; background-color: red"><span>asdasd</span></div>
<br>
<div class="bot" id="boton4" style="width:200px; height:50px; background-color: red"><span>asdasd</span></div>
<br>
<div class="bot" id="boton5" style="width:200px; height:50px; background-color: red"><span>asdasd</span></div>
</div>
<br>
<script src="script.js"></script>
</body>
</html>

最佳答案

在 JS 事件中,e.target是执行操作(单击)的元素,this代码附加到的元素。这可以用来检查parentNode是否是点击所附加的div(好吧,可以通过通过其id检查父节点是否是div来完成相同的操作,但由于这是一个事件委托(delegate)练习,this更重要有趣:))

document.getElementById("contenedor").addEventListener("click", function (e) {
var target = e.target;
if(target!==this){ //if the div itself is clicked do nothing
while(target.parentNode !== this) //loop up until it's a direct parent, this also works with multiple nested elements
target = target.parentNode;
target.parentNode.removeChild(target);
}
document.getElementById("parrafo").textContent = "Hice click en";

});

fiddle

作为旁注,不要添加 <BR>在每个 div 下,您还可以通过 css 更改边距,例如

.bot{
margin-bottom:20px;
}

这样做的优点是删除的元素保留相同的空间(当然,除非这不是本意;))

示例:fiddle

关于javascript - 事件委托(delegate): Affecting more elements than it should,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31300192/

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