搜索 div 是否包含 class(vanilla js)
Search if div contains class (vanilla js)
我是从 vanilla JS 开始的,所以别生气 ;)
尝试编写井字游戏代码。
我有这个HTML:
<div class="container">
<div class="row">
<div class="cel empty" id="a1">
<p>x</p>
</div>
<div class="cel empty" id="a2">
x
</div>
<div class="cel empty" id="a3">
x
</div>
</div>
<div class="row">
<div class="cel empty" id="b1"> x</div>
<div class="cel empty" id="b2"> x</div>
<div class="cel empty" id="b3"> x</div>
</div>
<div class="row">
<div class="cel empty" id="c1"> x</div>
<div class="cel empty" id="c2"> x</div>
<div class="cel empty" id="c3">x </div>
</div>
</div>
还有这个 JS:
var fieldEmptyElements = document.querySelectorAll('div.cel');//pobieram divy które zawierają klasę empty
window.addEventListener('load', checkHowManyEmpty);//po załadowaniu strony wczytuje funkcję o nazwie checkHowManyEmpty
//funkcja ma za zadanie sprawdzić jak dużo pól div ma klasę empty
function checkHowManyEmpty(){
for(var i=0, max=fieldEmptyElements.length; i<max; i++){
if(fieldEmptyElements.classList.contains('empty')){
alert('there is one element with empty class');
}
else{
alert('no element with empty class');
}
}
}
函数需要检查是否有任何元素有 class EMPTY - 但控制台给了我这个:“未捕获的类型错误:无法读取未定义的 属性 'contains'
在 checkHowManyEmpty”。知道为什么吗?
我认为您实际上是想这样做:(您应该访问集合的当前索引)
// ...
if (fieldEmptyElements[i].classList.contains('empty')) {
// ...
fieldEmptyElements 是一个数组。要访问数组中的项目,您需要索引,在您的情况下是 i 变量。
对于循环的每次迭代,我增加 1.
if (fieldEmptyElements[i].classList.contains('empty'))
通过这种方式,您可以访问具有当前索引的数组项。
document.querySelectorAll() returns 一个节点列表。然后,您正在查看节点列表的 classList 属性。这是错误的,因为您需要检查节点列表中的每个元素,然后检查其类列表。
在您的 for 循环中,您将使用您的 var i 来索引您的节点列表。
fieldEmptyElements[i].classList
为什么要循环执行该检查,而不让选择器引擎完成工作?毕竟这就是它的优化目的......
document.querySelectorAll('div.cel.empty').length
会在一个简单的方法调用中告诉您 div.cell
元素中是否有带有 class empty
的元素。
评论中的函数示例 - 不必要的 else-if 替换为简单的 else:
function checkHowManyEmpty() {
var fieldEmptyElements = document.querySelectorAll('div.cel.empty');
if (fieldEmptyElements.length >= 1) {
console.log('at least one element');
} else {
console.log('no empty elements');
}
}
我是从 vanilla JS 开始的,所以别生气 ;) 尝试编写井字游戏代码。
我有这个HTML:
<div class="container">
<div class="row">
<div class="cel empty" id="a1">
<p>x</p>
</div>
<div class="cel empty" id="a2">
x
</div>
<div class="cel empty" id="a3">
x
</div>
</div>
<div class="row">
<div class="cel empty" id="b1"> x</div>
<div class="cel empty" id="b2"> x</div>
<div class="cel empty" id="b3"> x</div>
</div>
<div class="row">
<div class="cel empty" id="c1"> x</div>
<div class="cel empty" id="c2"> x</div>
<div class="cel empty" id="c3">x </div>
</div>
</div>
还有这个 JS:
var fieldEmptyElements = document.querySelectorAll('div.cel');//pobieram divy które zawierają klasę empty
window.addEventListener('load', checkHowManyEmpty);//po załadowaniu strony wczytuje funkcję o nazwie checkHowManyEmpty
//funkcja ma za zadanie sprawdzić jak dużo pól div ma klasę empty
function checkHowManyEmpty(){
for(var i=0, max=fieldEmptyElements.length; i<max; i++){
if(fieldEmptyElements.classList.contains('empty')){
alert('there is one element with empty class');
}
else{
alert('no element with empty class');
}
}
}
函数需要检查是否有任何元素有 class EMPTY - 但控制台给了我这个:“未捕获的类型错误:无法读取未定义的 属性 'contains' 在 checkHowManyEmpty”。知道为什么吗?
我认为您实际上是想这样做:(您应该访问集合的当前索引)
// ...
if (fieldEmptyElements[i].classList.contains('empty')) {
// ...
fieldEmptyElements 是一个数组。要访问数组中的项目,您需要索引,在您的情况下是 i 变量。 对于循环的每次迭代,我增加 1.
if (fieldEmptyElements[i].classList.contains('empty'))
通过这种方式,您可以访问具有当前索引的数组项。
document.querySelectorAll() returns 一个节点列表。然后,您正在查看节点列表的 classList 属性。这是错误的,因为您需要检查节点列表中的每个元素,然后检查其类列表。
在您的 for 循环中,您将使用您的 var i 来索引您的节点列表。
fieldEmptyElements[i].classList
为什么要循环执行该检查,而不让选择器引擎完成工作?毕竟这就是它的优化目的......
document.querySelectorAll('div.cel.empty').length
会在一个简单的方法调用中告诉您 div.cell
元素中是否有带有 class empty
的元素。
评论中的函数示例 - 不必要的 else-if 替换为简单的 else:
function checkHowManyEmpty() {
var fieldEmptyElements = document.querySelectorAll('div.cel.empty');
if (fieldEmptyElements.length >= 1) {
console.log('at least one element');
} else {
console.log('no empty elements');
}
}