找到与选择器匹配的元素的最有效方式是不在给定的DOM节点(即,我通过节点并且不一定能够推导出选择器来匹配它)。到目前为止,我有查找其他元素中不包含的元素的有效方法
var inputs = $("input").filter(function() {
return !$(excludedNode).has(this).length;
});
但忍不住想可能有比这为更好的解决办法,尽管不是非常多的代码,我怀疑它的效率非常高。
找到与选择器匹配的元素的最有效方式是不在给定的DOM节点(即,我通过节点并且不一定能够推导出选择器来匹配它)。到目前为止,我有查找其他元素中不包含的元素的有效方法
var inputs = $("input").filter(function() {
return !$(excludedNode).has(this).length;
});
但忍不住想可能有比这为更好的解决办法,尽管不是非常多的代码,我怀疑它的效率非常高。
我设置了a jsperf来测试其他人提出的有效建议和一个更多的想法。
Surprsingly,使用$.has
方法比使用$.closest
(因为它委托给浏览器的document.element.contains
,而$.closest
做一些选择操作和遍历DOM树)快3倍左右。它也快于$("div").not("#" + id + " *")
差不多。
所以最快的方法是
$("input").filter(function() {
return !$(excludedNode).has(this).length;
});
,并使用$.closest
,这直观地感觉最快的方式,实际上是最慢的
感谢您的答案... =) – gdoron 2012-03-03 21:36:21
这个什么:
var inputs = $("input").filter(function() {
return $(this).closest(excludedNode).length == 0
//or:
return !$(this).closest(excludedNode).length
});
它找到你想要的元素,然后检查是否有excludedNode
我想你可以跳过“== 0”,因为如果长度为0,它将返回“falsy”。 – David 2012-02-27 15:13:30
+1 @David。你说得对,我添加了它来澄清代码,我想添加一个关于它的评论,所以谢谢你为我做这件事...... **但是你需要在开头添加'!'。** – gdoron 2012-02-27 15:14:57
是啊,那会起作用。我将阅读jQuery源代码,以确定哪种方法看起来效率最高。你的方法可能迭代parentNode属性,而我的...我不知道'has'是如何工作的。它可能就像'$ .fn.has = function(el){return $ .fn.closest.apply(el,this)}',也就是'最接近'回到最前面' – wheresrhys 2012-02-27 15:17:58
$('input').not('#someID input').doSOmething()
父母如果“排除节点”有“身份证”什么作为选择使用,还有:
var inputs = $('input').not('#excluded *');
或
var inputs = $('input').not('#' + node.id + ' *');
+1这最终导致了一个通用的解决方案比其他任何事情快得多 – wheresrhys 2012-02-28 23:44:45
但我后来意识到它有一个缺陷,并将其删除。 – wheresrhys 2012-02-29 00:40:13
呃......好吗?我不知道这意味着什么,但无论如何... – Pointy 2012-02-29 02:54:35
var inputs = $('input').not('*', excludedNode);
或
var inputs = $('input').not('*', $(excludedNode));
看起来更好。
什么'$('#富:不是(:有(。巴))')'? – Blender 2012-02-27 15:10:07
@Blender - 我通过了DOM节点,而不是DOM节点的ID,所以不能使用纯粹的选择器方法 – wheresrhys 2012-02-27 15:12:51
@wheresrhys你可以,如果节点*有*一个“ID”... – Pointy 2012-02-27 15:14:10