找到未包含在另一个元素中的元素的有效方法

时间:2012-02-27 15:07:16

标签: javascript jquery filter

找到匹配选择器的元素的最有效方法是什么?它不在给定的DOM节点内部(即我传递了节点,并且不一定推导出一个匹配它的选择器) 。到目前为止我已经

var inputs = $("input").filter(function() {
    return !$(excludedNode).has(this).length;
});

但不禁想到可能有更好的解决方案,因为尽管代码不是很多,但我怀疑它是非常有效的。

5 个答案:

答案 0 :(得分:2)

这个怎么样:

var inputs = $("input").filter(function() {
    return $(this).closest(excludedNode).length == 0
    //or:
    return !$(this).closest(excludedNode).length
});

找到您想要的元素,然后检查它是否具有excludedNode

的父级

答案 1 :(得分:2)

我设置了a jsperf来测试其他人提出的有效建议以及另外一个想法。

令人惊讶的是,使用$.has的方法比使用$.closest快3倍(因为它委托给浏览器document.element.contains,而$.closest做了一些选择器操作和遍历DOM树)。它的速度也比$("div").not("#" + id + " *")快得多。

所以最快的方法是

$("input").filter(function() {
    return !$(excludedNode).has(this).length;
});

并且使用直觉感觉最快的$.closest实际上是最慢的

答案 2 :(得分:1)

如果“排除的节点”有一个“id”或某些东西用作选择器,那就是:

var inputs = $('input').not('#excluded *');

var inputs = $('input').not('#' + node.id + ' *');

答案 3 :(得分:0)

$('input').not('#someID input').doSOmething()

答案 4 :(得分:0)

var inputs = $('input').not('*', excludedNode);

var inputs = $('input').not('*', $(excludedNode));

看起来更好。