如何查询 Select class 的所有 children,但没有 class 的孙子
How to Query Select all children of a class, but no grandsons of that class
我有 css class 'control',我想从我的容器中获取所有 'control' children 元素,但我不想得到孙子 'control'.
<div id='mydiv'>
<div id='div1' class='control'>
<div id='div2' class='control'></div>
<div id='div3' class='control'></div>
</div>
<div class='other'>
<div id='div4' class='control'></div>
<div id='div5' class='control'>
<div id='div6' class='control'></div>
<div id='div7' class='control'></div>
</div>
</div>
</div>
下面的调用将使我获得 'mydiv' 中的所有控件。
document.querySelectorAll('#mydiv .control');
我想要一个只返回#div1、#div4 和#div5 的查询;
这可能吗?
只有 querySelector*
目前无法使用。
以后浏览器会支持 :has()
pseudo-selector.
然后你可以 select 只有元素里面有或没有像这样的元素:
#mydiv .control:not(:has(.control))
查看当前浏览器对此的支持:https://caniuse.com/css-has
目前您需要以下解决方案:
const elements = [...document.querySelectorAll('#mydiv .control')].filter(element => {
return element.parentNode.closest('.control') == null
});
console.log(elements);
<div id='mydiv'>
<div id='div1' class='control'>
<div id='div2' class='control'></div>
<div id='div3' class='control'></div>
</div>
<div class='other'>
<div id='div4' class='control'></div>
<div id='div5' class='control'>
<div id='div6' class='control'></div>
<div id='div7' class='control'></div>
</div>
</div>
</div>
解释:
首先将所有 .control
元素放入一个数组中(querySelectorAll
returns a NodeList
and NodeList
does'nt have methods like filter
. 所以我们用 spread syntax [...variable]
提取它
然后过滤所有没有名为.control
.
父元素的元素
.closest()
可以 return 本身,所以我们需要确保首先调用 parentNode
。
我有 css class 'control',我想从我的容器中获取所有 'control' children 元素,但我不想得到孙子 'control'.
<div id='mydiv'>
<div id='div1' class='control'>
<div id='div2' class='control'></div>
<div id='div3' class='control'></div>
</div>
<div class='other'>
<div id='div4' class='control'></div>
<div id='div5' class='control'>
<div id='div6' class='control'></div>
<div id='div7' class='control'></div>
</div>
</div>
</div>
下面的调用将使我获得 'mydiv' 中的所有控件。
document.querySelectorAll('#mydiv .control');
我想要一个只返回#div1、#div4 和#div5 的查询; 这可能吗?
只有 querySelector*
目前无法使用。
以后浏览器会支持 :has()
pseudo-selector.
然后你可以 select 只有元素里面有或没有像这样的元素:
#mydiv .control:not(:has(.control))
查看当前浏览器对此的支持:https://caniuse.com/css-has
目前您需要以下解决方案:
const elements = [...document.querySelectorAll('#mydiv .control')].filter(element => {
return element.parentNode.closest('.control') == null
});
console.log(elements);
<div id='mydiv'>
<div id='div1' class='control'>
<div id='div2' class='control'></div>
<div id='div3' class='control'></div>
</div>
<div class='other'>
<div id='div4' class='control'></div>
<div id='div5' class='control'>
<div id='div6' class='control'></div>
<div id='div7' class='control'></div>
</div>
</div>
</div>
解释:
首先将所有 .control
元素放入一个数组中(querySelectorAll
returns a NodeList
and NodeList
does'nt have methods like filter
. 所以我们用 spread syntax [...variable]
然后过滤所有没有名为.control
.
父元素的元素
.closest()
可以 return 本身,所以我们需要确保首先调用 parentNode
。