找到與選擇器匹配的元素的最有效方式是不在給定的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