我可以这样做:

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

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

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

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

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


当前回答

单线版本

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

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

其他回答

我想补充的是,您可以通过为当前节点分配临时属性来扩展:scope的兼容性。

let node = [...];
let result;

node.setAttribute("foo", "");
result = window.document.querySelectorAll("[foo] > .bar");
// And, of course, you can also use other combinators.
result = window.document.querySelectorAll("[foo] + .bar");
result = window.document.querySelectorAll("[foo] ~ .bar");
node.removeAttribute("foo");

如果你确定元素是唯一的(比如你的ID case):

myDiv.parentElement.querySelectorAll("#myDiv > .foo");

对于一个更“全局”的解决方案:(使用matchesSelector shim)

function getDirectChildren(elm, sel){
    var ret = [], i = 0, l = elm.childNodes.length;
    for (var i; i < l; ++i){
        if (elm.childNodes[i].matchesSelector(sel)){
            ret.push(elm.childNodes[i]);
        }
    }
    return ret;
}

elm是父元素,sel是选择器。完全可以作为一个原型。

我会和你一起去的

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

单线版本

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

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

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

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

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