2012-02-27 94 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)); 

看起來更好。

相關問題