Javascript 如何获取不是特定节点的后代的后代

Javascript 如何获取不是特定节点的后代的后代,javascript,jquery,jquery-selectors,Javascript,Jquery,Jquery Selectors,我使用的是jquery,我希望获得特定类型的所有元素,这些元素不是特定类型节点的后代 例如,我的DOM类似于: <div id='idthatiknow'> <div> <span>good1</span> </div> <div> <span>good2</span> </div> <p>

我使用的是jquery,我希望获得特定类型的所有元素,这些元素不是特定类型节点的后代

例如,我的DOM类似于:

<div id='idthatiknow'>
    <div>
        <span>good1</span>
    </div>
    <div>
        <span>good2</span>
    </div>
    <p>
        <span>bad</span>
        <div>
            <span>bad</span>
        </div>
    </p>
<div>
我需要一个选择器,它可以让我得到good1和good2,但还不错。但是,我需要从我知道的id开始。所以我在想,像IdThat这样的东西我不知道跨越,但那不起作用。请记住,我的实际dom要复杂得多——这只是一个简化的示例


那么,有什么方法可以检索所有X的后代而不是Y的后代的元素吗?

您总是可以在父元素上进行筛选

$('#idthatiknow span').filter(function() {
    return $(this).closest('p').length === 0;
});

请注意,最后一个选项不起作用,因为DIV不能在p中,所以它是由浏览器移动的。

有人发布了答案,但随后将其删除。我重新发布它,因为它是正确的,但出于对他们删除答案的任何理由的尊重,我不会给他们命名,我会让这个社区成为wiki。如果他们想再次发回,我会将其标记为正确,否则我会将此答案标记为正确

他们张贴:

#idthatiknow > div span { /* your styles here */}
/* all spans with a direct child of div from #idthatiknow */


#idthatiknow span:not(#idthatiknow > div span) { /* your styles here */}
/* all spans except the ones with a direct child of div from #idthatiknow */

第二个解决了我的问题-它允许选择任意元素的任意子代,不包括另一个元素的子代。

idthatiknow>:notp span尽管你说实际情况更复杂,但谁知道呢?在上面的例子中,肯定是idthatiknow div span?FWIW,不能在元素内…此外,您的示例标记无效。如果您实际使用的是无效标记,那么无法保证任何选择器都能正常工作。如果您知道标记无效,那么为什么要将其作为示例发布?你是说实际的标记是否具有这种结构?我删除了它,因为它只选择了子代而不是子代,所以我没有真正回答这个问题:该解决方案被发布为CSS选择器而不是jQuery选择器,这使得它无效,因为该选择器被赋予:not。更不用说它不必要的复杂,而且不符合您所描述的。@cookiemonster我也是这么想的,但我在jquery中尝试了它,并且worked@mister_rampage删除'>'使其成为子代而不是子代是很简单的。选择一个从X而不是Y递减的元素是个热门问题,xe:notye是这样做的。@Benubird当然,我只是说作为CSS选择器它不起作用。jQuery使用非标准选择器。