2012-05-31 59 views
0

我有一系列不同類的行。jQuery遍歷contiguos同伴

<tr class="head">... 
<tr class="group">... 
<tr class="item">... 
<tr class="item">... 
<tr class="item">... 
<tr class="group">... 
<tr class="item">... 
<tr class="item">... 
<tr class="item">... 
<tr class="group">... 
<tr class="item">... 
<tr class="item">... 
<tr class="item">... 

假設我的背景是在項目中的一個,我怎麼之前選擇的所有行,之後包含其是項目,沒有跨越一組?

在這個例子中,無論我在哪一行項目,我都應該總是產生三個項目行的集合。

目前我有這個,雖然它的工作,我希望有一個更乾淨的方式。

喜歡的東西.siblings('tr.item')但將獲得所有九個項目,而不是三個contigous的。我不能把它們放在tbody中,因爲這已經在tbody中,並且它們嵌套是無效的html。

我把它提高到

var $itemRows = $targetRow.prevAll('tr.group:first').nextUntil('tr.group'); 
+0

如果你可以改變DOM,我只想它們分組在不同的'tbody'元素中 –

回答

2

假設this是其中一列(而不是組),你可以這樣做:

測試出許多場景之後,這是我發現了什麼工作:

$(this).prevUntil('tr.group').andSelf().nextUntil('tr.group').andSelf() 

問題是,當你點擊組中的第一個項目,其他組合,如gdoron的沒有爲我工作。

您可以在這裏看到這樣一個工作:http://jsfiddle.net/jfriend00/mks74/


我想一定有位更清潔的方式,所以我一直做這個工作,這是我發現:

$(this).prevAll('tr.group:first').nextUntil('tr.group') 

你可以在這裏看到這個工作:http://jsfiddle.net/jfriend00/HZVnX/


什麼是usef ul這裏(jQuery似乎沒有提供)是一個jQuery方法,它可以獲得符合某些選擇器標準的前一個兄弟。我們可以讓我們自己是這樣的:

jQuery.fn.prior = function(selector) { 
    return (this.pushStack(this.prevAll(selector).first())); 
}; 

而且,當時的代碼來解決這個問題變得有點更符合邏輯閱讀:

$(this).prior('tr.group').nextUntil('tr.group') 
+0

它也行不通,我測試過它。 – gdoron

+0

將此提升爲'$(this).prevAll('tr.group:first')。nextUntil('tr.group');' – CaffGeek

+0

您應該玩我的小提琴,您的代碼並不涵蓋所有情況。 http://jsfiddle.net/aH6Qu/ – gdoron