JavaScript:如何使用事件委托获取子元素 "i" 类名?
JavaScript: How to get child element "i" classname using alongside event delegation?
我正在为我的最终项目重新创建一个 classic 卡记忆游戏 - 我需要翻转和匹配的一副纸牌。 HTML 中的一副牌摘录如下:
<ul class="deck">
<li class="card">
<i class="fa fa-diamond"></i>
</li>
<li class="card">
<i class="fa fa-paper-plane-o"></i>
</li>
<li class="card">
<i class="fa fa-diamond"></i>
</li>
<li class="card">
<i class="fa fa-paper-plane-o"></i>
</li>
</ul>
我已经通过将事件委托应用到父节点并使用 event.target 属性.
添加了翻转功能
document.querySelector('.deck').addEventListener('click', function(event) {
if (event.target.nodeName === 'LI') {
event.target.classList.add('open');
//get child element "i" classname, add to array and match cards
}
});
现在我需要获取被点击的卡片的子项,将其添加到数组中,然后使用该数组将两张打开的卡片匹配在一起。问题是,我似乎无法弄清楚如何获取子元素的 class(例如 i class="fa fa-diamond")。我该如何从这里开始?
我考虑过只为每张卡片添加一个单独的事件侦听器,但我想这将是一个成本更高的操作。或者这会更好吗?期待您的帮助和建议。
获取实际的子调用querySelector()
from the event.target
passing in a selector that will match your <i>
element, eg i.fa
. Or if it is the only child element of that <li>
just grab the first element in children
var child = event.target.querySelector("i.fa");
//or
var child = event.target.children[0];
此外,您不需要将每个元素的 class(es) 添加到数组中。保存点击的卡片,当点击下一张卡片时,只需将其与保存的卡片进行比较。
savedI.className == child.className
演示
var openCard = null;
document.querySelector('.deck').addEventListener('click', function(event) {
//check that we havent clicked on the <li> or child <i>
if (event.target.nodeName !== "LI" && event.target.nodeName !== "I") {
return;
}
var child = null;
if (event.target.nodeName == "LI") {
//if we clicked on the li, child is target.children[0]
child = event.target.children[0];
} else {
//if we clicked on the i directly, child is just the event target
child = event.target;
}
child.parentElement.classList.add('open');
if (openCard && openCard.className == child.className) {
openCard.classList.add("match");
child.classList.add("match");
openCard = null;
console.log("match");
} else if (openCard) {
openCard.parentElement.classList.remove("open");
child.parentElement.classList.remove("open");
openCard = null;
console.log("No match");
} else {
openCard = child;
}
});
i {
height: 32px;
width: 32px;
display: block;
}
.open {
outline: 1px solid #F00;
}
li i.match {
background: #0F0;
}
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css" />
<ul class="deck">
<li class="card">
<i class="fa fa-diamond"></i>
</li>
<li class="card">
<i class="fa fa-paper-plane-o"></i>
</li>
<li class="card">
<i class="fa fa-diamond"></i>
</li>
<li class="card">
<i class="fa fa-paper-plane-o"></i>
</li>
</ul>
我正在为我的最终项目重新创建一个 classic 卡记忆游戏 - 我需要翻转和匹配的一副纸牌。 HTML 中的一副牌摘录如下:
<ul class="deck">
<li class="card">
<i class="fa fa-diamond"></i>
</li>
<li class="card">
<i class="fa fa-paper-plane-o"></i>
</li>
<li class="card">
<i class="fa fa-diamond"></i>
</li>
<li class="card">
<i class="fa fa-paper-plane-o"></i>
</li>
</ul>
我已经通过将事件委托应用到父节点并使用 event.target 属性.
添加了翻转功能document.querySelector('.deck').addEventListener('click', function(event) {
if (event.target.nodeName === 'LI') {
event.target.classList.add('open');
//get child element "i" classname, add to array and match cards
}
});
现在我需要获取被点击的卡片的子项,将其添加到数组中,然后使用该数组将两张打开的卡片匹配在一起。问题是,我似乎无法弄清楚如何获取子元素的 class(例如 i class="fa fa-diamond")。我该如何从这里开始?
我考虑过只为每张卡片添加一个单独的事件侦听器,但我想这将是一个成本更高的操作。或者这会更好吗?期待您的帮助和建议。
获取实际的子调用querySelector()
from the event.target
passing in a selector that will match your <i>
element, eg i.fa
. Or if it is the only child element of that <li>
just grab the first element in children
var child = event.target.querySelector("i.fa");
//or
var child = event.target.children[0];
此外,您不需要将每个元素的 class(es) 添加到数组中。保存点击的卡片,当点击下一张卡片时,只需将其与保存的卡片进行比较。
savedI.className == child.className
演示
var openCard = null;
document.querySelector('.deck').addEventListener('click', function(event) {
//check that we havent clicked on the <li> or child <i>
if (event.target.nodeName !== "LI" && event.target.nodeName !== "I") {
return;
}
var child = null;
if (event.target.nodeName == "LI") {
//if we clicked on the li, child is target.children[0]
child = event.target.children[0];
} else {
//if we clicked on the i directly, child is just the event target
child = event.target;
}
child.parentElement.classList.add('open');
if (openCard && openCard.className == child.className) {
openCard.classList.add("match");
child.classList.add("match");
openCard = null;
console.log("match");
} else if (openCard) {
openCard.parentElement.classList.remove("open");
child.parentElement.classList.remove("open");
openCard = null;
console.log("No match");
} else {
openCard = child;
}
});
i {
height: 32px;
width: 32px;
display: block;
}
.open {
outline: 1px solid #F00;
}
li i.match {
background: #0F0;
}
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css" />
<ul class="deck">
<li class="card">
<i class="fa fa-diamond"></i>
</li>
<li class="card">
<i class="fa fa-paper-plane-o"></i>
</li>
<li class="card">
<i class="fa fa-diamond"></i>
</li>
<li class="card">
<i class="fa fa-paper-plane-o"></i>
</li>
</ul>