2012-02-27 95 views
1

找到与选择器匹配的元素的最有效方式是不在给定的DOM节点(即,我通过节点并且不一定能够推导出选择器来匹配它)。到目前为止,我有查找其他元素中不包含的元素的有效方法

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

但忍不住想可能有比这为更好的解决办法,尽管不是非常多的代码,我怀疑它的效率非常高。

+1

什么'$('#富:不是(:有(。巴))')'? – Blender 2012-02-27 15:10:07

+0

@Blender - 我通过了DOM节点,而不是DOM节点的ID,所以不能使用纯粹的选择器方法 – wheresrhys 2012-02-27 15:12:51

+0

@wheresrhys你可以,如果节点*有*一个“ID”... – Pointy 2012-02-27 15:14:10

回答

2

我设置了a jsperf来测试其他人提出的有效建议和一个更多的想法。

Surprsingly,使用$.has方法比使用$.closest(因为它委托给浏览器的document.element.contains,而$.closest做一些选择操作和遍历DOM树)快3倍左右。它也快于$("div").not("#" + id + " *")差不多。

所以最快的方法是

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

,并使用$.closest,这直观地感觉最快的方式,实际上是最慢的

+0

感谢您的答案... =) – gdoron 2012-03-03 21:36:21

2

这个什么:

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

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

+1

我想你可以跳过“== 0”,因为如果长度为0,它将返回“falsy”。 – David 2012-02-27 15:13:30

+0

+1 @David。你说得对,我添加了它来澄清代码,我想添加一个关于它的评论,所以谢谢你为我做这件事...... **但是你需要在开头添加'!'。** – gdoron 2012-02-27 15:14:57

+0

是啊,那会起作用。我将阅读jQuery源代码,以确定哪种方法看起来效率最高。你的方法可能迭代parentNode属性,而我的...我不知道'has'是如何工作的。它可能就像'$ .fn.has = function(el){return $ .fn.closest.apply(el,this)}',也就是'最接近'回到最前面' – wheresrhys 2012-02-27 15:17:58

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

父母如果“排除节点”有“身份证”什么作为选择使用,还有:

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

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

+1这最终导致了一个通用的解决方案比其他任何事情快得多 – wheresrhys 2012-02-28 23:44:45

+0

但我后来意识到它有一个缺陷,并将其删除。 – wheresrhys 2012-02-29 00:40:13

+0

呃......好吗?我不知道这意味着什么,但无论如何... – Pointy 2012-02-29 02:54:35

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

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

看起来更好。

相关问题