我可以这样做:

<div id="myDiv">
   <div class="foo"></div>
</div>
myDiv = getElementById("myDiv");
myDiv.querySelectorAll("#myDiv > .foo");

也就是说,我可以成功地检索myDiv元素的所有具有类.foo的直接子元素。

问题是,它困扰我,我必须包括在选择器中的#myDiv,因为我是在myDiv元素上运行查询(所以它显然是多余的)。

我应该能够离开#myDiv关闭,但选择器是不合法的语法,因为它以>开始。

有人知道如何编写一个选择器,它只获取选择器所运行的元素的直接子元素吗?


当前回答

有人知道如何编写一个选择器,它只获取选择器所运行的元素的直接子元素吗?

编写“根”到当前元素的选择器的正确方法是使用:scope。

var myDiv = getElementById("myDiv");
var fooEls = myDiv.querySelectorAll(":scope > .foo");

然而,浏览器支持有限,如果你想使用它,你需要一个垫片。为此,我构建了scopedQuerySelectorShim。

其他回答

我只是没有尝试就这么做了。这样能行吗?

myDiv = getElementById("myDiv");
myDiv.querySelectorAll(this.id + " > .foo");

试一试,也许有用,也许没用。抱歉,但我现在不在电脑上尝试它(从我的iPhone回复)。

function siblings(el) {
    return el.closest('*:not(:scope)').querySelectorAll(':scope > *');
}

纯JS代码

El -是元素 这里我们有一个函数,它在以下步骤中工作:

取任何直接父类,但不取我们传递的el(最接近的可以取el,因此我们确保el不会作为结果) 带走所有直系子女

单线版本

var direct_children=Array.from(parent_el.querySelectorAll('span')).filter(function(a){return a.parentNode===parent_el;});

我发现这在父元素给定的情况下是非常方便的。我测试过了,100%有效。

下面是一个用普通JS编写的灵活方法,它允许你只对元素的直接子元素运行CSS选择器查询:

var count = 0;
function queryChildren(element, selector) {
  var id = element.id,
      guid = element.id = id || 'query_children_' + count++,
      attr = '#' + guid + ' > ',
      selector = attr + (selector + '').replace(',', ',' + attr, 'g');
  var result = element.parentNode.querySelectorAll(selector);
  if (!id) element.removeAttribute('id');
  return result;
}

我会和你一起去的

var myFoo = document.querySelectorAll("#myDiv > .foo");
var myDiv = myFoo.parentNode;