是否可以阻止 jQuery.find() 在 DOM 树的某些节点下方搜索?
Is it possible to prevent jQuery.find() from searching below certain nodes of the DOM tree?
假设以下 DOM 结构:
.grandparent
.parent
.child .successful
.a
.b
.an-arbitrary-subtree
.parent
.child
.a
.b
.a-different-arbitrary-subtree
.adopted
.child
.a
.b
.another-arbitrary-subtree
.with-different-parents
.but-sometimes-common-css-classes .successful
如果我 $('.grandparent').find('.successful')
毫不奇怪,我会回来 [.child .successful, .but-sometimes-common-css-classes .successful]
有什么方法可以阻止 jQuery 的查找方法在 .child 节点下方遍历?也许我可以自己重新实现 $.find() 并在节点上添加一个顶级 class 来停止搜索(在本例中为 .b
)
我为什么要问? 即使我们还没有 Shadow Dom,我想创建可以包含组件的组件(由其他开发人员匿名创建) 而不用担心泄漏。聚合物还不够稳定。我更喜欢在这些组件中限定我的 jQuery 选择器的范围,但只能从子树的顶部节点限定范围,并且还没有办法将范围限制到树的深处。
可以使用not()
方法或:not()
选择器或filter()
。没有一些更现实的标准来从这个例子开始工作有点基础。
$('.grandparent .a').not('.adopted .child .a').doSomething();
考虑使用 each()
,然后从返回的列表中获取 .child
的第一个实例。类似于:
$('.parent').each(function() {
return $(this).find('.successful').first();
});
您可以使用 .filter()
并检查集合中每个项目的父元素。
很难做到这一点。如果您想在没有附加信息的情况下合理保证效率(例如,当您 不 感兴趣的子树可能任意大时),那么您将不得不手动遍历 DOM.
否则,您可以拉出所有候选人并过滤掉您不想要的候选人:
$('.grandparent')
.find('.successful')
.filter(function() { return !$(this).closest(".child").length; })
如果你走后一条路线,请确保准确无误:
- 如果
.successful
个元素是 .child
个,是否要过滤掉它们本身?使用 closest
可以做到这一点,但也许您不需要这样做。
- 有没有可能
.child
出现在.grandparent
上面?如果是这样,则需要增强过滤功能,使其不会拒绝所有候选匹配项。
如果我没理解错的话,您想要访问所有拥有自己的“.success”子元素的“.child”元素。
您可以通过在“.grandparent”元素中搜索所有“.success”子元素来实现这一点,当您到达“.success”元素时,然后搜索其名为“.child”的父元素。
像这样:
$('.grandparent').find('.successful').parents("child:first");
如果这不是您所要求的,希望它能帮助您找到正确的解决方案:)
假设以下 DOM 结构:
.grandparent
.parent
.child .successful
.a
.b
.an-arbitrary-subtree
.parent
.child
.a
.b
.a-different-arbitrary-subtree
.adopted
.child
.a
.b
.another-arbitrary-subtree
.with-different-parents
.but-sometimes-common-css-classes .successful
如果我 $('.grandparent').find('.successful')
毫不奇怪,我会回来 [.child .successful, .but-sometimes-common-css-classes .successful]
有什么方法可以阻止 jQuery 的查找方法在 .child 节点下方遍历?也许我可以自己重新实现 $.find() 并在节点上添加一个顶级 class 来停止搜索(在本例中为 .b
)
我为什么要问? 即使我们还没有 Shadow Dom,我想创建可以包含组件的组件(由其他开发人员匿名创建) 而不用担心泄漏。聚合物还不够稳定。我更喜欢在这些组件中限定我的 jQuery 选择器的范围,但只能从子树的顶部节点限定范围,并且还没有办法将范围限制到树的深处。
可以使用not()
方法或:not()
选择器或filter()
。没有一些更现实的标准来从这个例子开始工作有点基础。
$('.grandparent .a').not('.adopted .child .a').doSomething();
考虑使用 each()
,然后从返回的列表中获取 .child
的第一个实例。类似于:
$('.parent').each(function() {
return $(this).find('.successful').first();
});
您可以使用 .filter()
并检查集合中每个项目的父元素。
很难做到这一点。如果您想在没有附加信息的情况下合理保证效率(例如,当您 不 感兴趣的子树可能任意大时),那么您将不得不手动遍历 DOM.
否则,您可以拉出所有候选人并过滤掉您不想要的候选人:
$('.grandparent')
.find('.successful')
.filter(function() { return !$(this).closest(".child").length; })
如果你走后一条路线,请确保准确无误:
- 如果
.successful
个元素是.child
个,是否要过滤掉它们本身?使用closest
可以做到这一点,但也许您不需要这样做。 - 有没有可能
.child
出现在.grandparent
上面?如果是这样,则需要增强过滤功能,使其不会拒绝所有候选匹配项。
如果我没理解错的话,您想要访问所有拥有自己的“.success”子元素的“.child”元素。 您可以通过在“.grandparent”元素中搜索所有“.success”子元素来实现这一点,当您到达“.success”元素时,然后搜索其名为“.child”的父元素。
像这样:
$('.grandparent').find('.successful').parents("child:first");
如果这不是您所要求的,希望它能帮助您找到正确的解决方案:)