2012-02-19 74 views
1

我有一個函數可以找到第一個可見孩子的索引。它的工作原理,但我想知道是否有一個更快/更好的方式來做到這一點:在jQuery中查找第一個可見孩子的索引

var TheDiv = $('#' + TheDivID); 
var CurrentIndex = 0; 

TheDiv.children().each(function() { 
    if ($(this).is(':visible')) { 
     CurrentIndex = $(this).index(); 
     break; 
    } 
}); 

感謝您的建議。

回答

5

如果TheDiv確實已經存在,加上在.children()方法的選擇,並使用.index()來獲取元素的索引:

TheDiv.children(':visible').index(); 

否則,使用:

CurrentIndex = $('#' + TheDivID + ' > :visible').index(); 
+0

啊,是的,有一個班輪;謝謝。 – frenchie 2012-02-19 22:06:19

+1

直到您將':visible:first'放入主DOM選擇中,我才與您同在。 – 2012-02-19 22:07:16

+0

@amnotiam哎呀,我同意,':first'可以省略,因爲它返回集合中第一個元素的索引。 – 2012-02-19 22:10:08

3

Rob W's answer好,並且可能是編寫此代碼的最短途徑。但是,它不一定是最有效的。

jQuery的自定義選擇器是。它們不是可以使用querySelectorAll的本機選擇器的補丁。更重要的是,children(':visible')(或諸如此類)測試每個元素的可見性,即使這不是您的應用程序所必需的。例如,如果你有300個孩子,第一個是可見的,你不需要測試下一個299,但是這個方法會這樣做。

所以實際上你在你的問題中提出的方法可能不會離理想太遠。這是行不通的,因爲它是(break不在一個jQuery選擇工作)和is是驚人慢,但我認爲它可以清理...

TheDiv.children().each(function (i) { 
    if (jQuery.expr[':'].visible(this)) { 
     CurrentIndex = i; 
     return false; 
    } 
}); 

這使用return false打出來的each循環。它還使用jQuery的過濾器(以完全非正統和未記錄的方式)來測試可見性。令人困惑的線路完全等同於$(this).is(':visible'),除此之外更爲迅速。

因爲一旦找到可見元素就會跳出循環,它可能比選擇器串方法快。

+0

對於優化版本+1,雖然在那一點上,我們不妨考慮是什麼讓它不可見,並直接測試*(假設孩子們都是因爲同樣的原因而不可見的)*。 – 2012-02-19 22:26:12

+1

......哎呀,爲什麼我們甚至需要'.index()'?這些都是兄弟姐妹,所以你可以使用'.each()'中的'i'。 – 2012-02-19 22:27:15

+1

@amnotiam這是一個很好的觀點,謝謝 - 我同意最好的事情是測試根本原因。然而,如果元素被例如隱藏'隱藏',這是最好的技術... – lonesomeday 2012-02-19 22:38:35

相關問題