Javascript CSS3“的选择器;“不是后代”;或;找到最外面的“吗?”;?

Javascript CSS3“的选择器;“不是后代”;或;找到最外面的“吗?”;?,javascript,css,dojo,css-selectors,Javascript,Css,Dojo,Css Selectors,我使用的是dojo.query,它在内部使用CSS3选择器来标识要检索的元素 我试图找到的是所有带有标记“foo”的元素,但只有最外层的元素(即,允许一个“foo”嵌入到另一个元素中,我想忽略这些元素)。外部元素可以出现在文档的任何级别,嵌套在几乎任何其他元素中 当然,dojo.query('foo')返回所有foo元素,包括嵌套的元素(我不需要) 我的下一次尝试是dojo.query('foo:not(foo-foo)),但这不会返回任何结果(因为后代选择器不是“简单选择器”,所以:not)不

我使用的是
dojo.query
,它在内部使用CSS3选择器来标识要检索的元素

我试图找到的是所有带有标记“foo”的元素,但只有最外层的元素(即,允许一个“foo”嵌入到另一个元素中,我想忽略这些元素)。外部元素可以出现在文档的任何级别,嵌套在几乎任何其他元素中

当然,
dojo.query('foo')
返回所有foo元素,包括嵌套的元素(我不需要)

我的下一次尝试是
dojo.query('foo:not(foo-foo))
,但这不会返回任何结果(因为后代选择器不是“简单选择器”,所以
:not
)不支持它们)

我知道,对于这类事情,通常的CSS级别解决方案是定义两个规则(
foo
foo-foo
),以便对嵌套元素进行不同的处理。但这在这种情况下不起作用(因为这只是一个选择)。(在真正的CSS中,这也让我觉得不整洁,因为嵌套元素仍然应用了第一条规则,使得无法使用浏览器或父默认值来处理第一条规则覆盖的内容。)

如果有帮助的话,至少在一个foo位于另一个foo的内部时,它必须是一个直接子对象,尽管它们最终可以嵌套到任意级别。(即,'foo>foo'也将成功匹配所有嵌套的foo元素,但不幸的是,这仍然与我想要的相反。)

编辑:我目前使用的解决方法如下,尽管我仍然希望使用更优雅的方法(并且更安全,以防出现间接嵌套):


如果它始终是直系后代,那么您可以这样做

dojo.query("foo").filter(function(item) {
    return (item.parentNode.nodeName.toLowerCase() !== "foo");
})

一如往常:没有祖先CSS选择器。这与我目前使用的黑客解决方案非常接近,我将对此进行说明,但我希望有更优雅的东西。我已经编辑了这个问题,以包括我当前的解决方法。
dojo.query("foo").filter(function(item) {
    return (item.parentNode.nodeName.toLowerCase() !== "foo");
})