当使用querySelectorAll,有没有参考上下文节点的直接子项,而无需使用ID的方法是什么?

2019-06-26 05:29发布

说我有一个HTML的结构类似

<div id="a">
  <div id="b">
    <div id="c"></div>
  </div>
</div>

要为“A”使用querySelectorAll我可以做这样的事情的孩子做一个查询

//Get "b", but not "c"
document.querySelectorAll('#a > div')

我的问题是 :是否有可能做到这一点没有ID,直接引用的节点? 我想这样做

var a_div = document.getElementById('a')
a_div.querySelectorAll('> div') //<-- error here

但我得到一个错误,告诉我,我用的选择是无效的。


而如果你想知道,我的实际使用情况会更复杂的东西像“>包含.foo的.bar .baz”,所以我宁愿避免手动DOM遍历。 目前,我增加了临时ID为根格,但似乎像一个丑陋的黑客...

Answer 1:

没有,没有办法(还)引用一些元素的所有孩子的不使用该元素的引用。 因为>是一个子组合子 ,它代表一个父和子元件之间的关系,一个简单的选择器 (父)是必要的(在你例如丢失)。

在一个评论, BoltClock说 ,该选择器API级别2规范定义了一个方法findAll 名称可以改变 “,其接受作为参数什么可能会被称为相对选择器(选择器可以与一个组合子开始,而不是化合物选择器) “。
当此实现,可以使用如下:

a_div.findAll('> div');


Answer 2:

document.querySelector('#a').querySelectorAll(':scope > div')

我不知道浏览器的支持,我却用它在Chrome和Chrome移动打包应用程序,它工作正常。



Answer 3:

我想我一定是误解了你的问题,但是这是我怎么解释呢..

var a = document.getElementById('a')
var results = a.querySelectorAll('div');

结果现在将持有的所有孩子的div。



文章来源: When using querySelectorAll, is there a way to reference the immediate children of the context node, without using IDs?