[英]Event Delegation, how to target a specific span inside a div
给定一堆这样的div:
<div class="itemGrid">
<div id="itemOne" class="fruit">
<span> Banana </span>
🍌
</div>
<div id="itemTwo" class="fruit">
<span> Apple </span>
🍎
</div>
</div>
我希望能够使用事件委托来在单击这些div时获取跨度的值(因此只是文本)。
这样我就可以得到所有内容,文本和符号,但是我似乎无法仅将文本包含在范围内:
const fruitButtons = document.querySelectorAll(".fruit span");
const grid = document.querySelector(".itemGrid");
grid.addEventListener("click", function(e) {
if (e.target.nodeName == "DIV") {
console.log(e.target.textContent)
}
})
您的代码不是正确的event delegation
您应该检查是否在div
内单击class=fruit
。 然后,您可以从其span
子孙中提取text
。
grid.addEventListener("click", function(e) {
let node = e.target;
let div = null;
// first let's check if we clicked inside div with class fruit by going up the DOM tree
while(node !== this){
if(node.hasClass("fruit")){
div = node;
break;
}
node = node.parentNode;
}
// if we clicked inside, log the value of span
if(div !== null){
console.log(div.querySelector("span").textContent);
}
});
使用getElementsByTagName()查找目标下的span元素。
正如所指出的那样,人们可以解释一个隐含的要求,即用户应该能够单击span元素并记录该元素的内容。 通过添加while循环来搜索祖先链,添加了对此的支持:
//search ancestors for div in case user clicks on span element
while (target.nodeName !== "DIV" && e.target.parentNode !== null) {
target = e.target.parentNode;
}
const fruitButtons = document.querySelectorAll(".fruit span"); const grid = document.querySelector(".itemGrid"); grid.addEventListener("click", function(e) { var target = e.target; //search ancestors for div in case user clicks on span element while (target.nodeName !== "DIV" && e.target.parentNode !== null) { target = e.target.parentNode; } if (target.nodeName == "DIV") { var spans = target.getElementsByTagName('span'); if (spans.length) { console.log(spans[0].textContent); } } })
<div class="itemGrid"> <div id="itemOne" class="fruit"> <span> Banana </span> 🍌 </div> <div id="itemTwo" class="fruit"> <span> Apple </span> 🍎 </div> </div>
稍微修改场景:
const fruitButtons = document.querySelectorAll(".fruit > span"); const gridItems = document.querySelectorAll(".fruit"); // Loop through the div.fruit elements: gridItems.forEach(function(div){ // Wire each div.fruit to a click handler: div.addEventListener("click", function(e){ // When clicked, look for the first span within the div and get its text console.log(div.querySelector("span").textContent); }); });
<div class="itemGrid"> <div id="itemOne" class="fruit"> <span> Banana </span> 🍌 </div> <div id="itemTwo" class="fruit"> <span> Apple </span> 🍎 </div> </div>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.