2012-02-07 100 views
3

我有一個HTML看起來大致是這樣的:有沒有辦法獲得與鏈接幾個.next()方法相同的結果?

<tr id="row"> 
    <td id="cell_1">Cell 1</td> 
    <td id="cell_4">Cell 4</td> 
    <td id="cell_8">Cell 8</td> 
    <td id="cell_9">Cell 9</td> 
    <td id="cell_11">Cell 11</td> 
    ... 
</tr> 

我沒有改變它的方式。例如,我有一個變量cell,它指向表示第二個td的jQuery對象,並且我想要獲取cell之後的元素,即n單元格。一個辦法讓這將是:

var cell = $("#cell_4"); 

var next = cell; 
for (var i = 0; i < n; i++) { 
    next = next.next(); 
} 

但我認爲這不是最正確的方法,因爲它需要n的「動作」通過DOM量。我能想到過的另一種方法包括使用index()方法(未測試,因此它可以包含一些錯誤,但我認爲方法是可以理解的):

var index = $("#row > td").index(cell); 
var next = $("row td:nth-child(" + index + n + ")"); 

是否有「更好」,建於,方式來實現那結果?例如,一些東西,應該是這樣的:

var next = cell.nextTimes(n); 
+0

你不能把你的細胞ID已經存儲了在變量中並將其增加n,然後通過其ID獲取結果單元格? – 2012-02-07 12:59:56

+0

不,因爲你可以在例子html中看到,數字之間可能會有一些「漏洞」。例如,如果我們把'n === 2'和'cell'指向第一行,我們最終會用'$(「#cell_3」)'而不是'$(「#cell_8」)'。 – Przemek 2012-02-07 13:03:55

回答

2

正如在問題中的細胞具有id值,如果你能得到你從你開始在那裏想要的值,你可以只使用$('#cell_' + derivedValue)

但是,如果你不能做到這一點,你可以用nextAlleq

var next = cell.nextAll().eq(n); // Or `n-1`, depends on what `n` is 

nextAll返回所有元素的以下(下)兄弟姐妹,和eq減少匹配的集合的元素在給定的指數。

因此,例如,從cell.nextAll().eq(1)cell_1您的示例開始將返回 cell_8cell_4cell.nextAll().eq(0))。

Live example

+0

謝謝,最完整的答案。 – Przemek 2012-02-07 13:27:09

1

你可以使用nextAll()方法和使用:eq(n)選擇(或eq()方法)來選擇它。

你可以這樣寫自己的nextTimes()方法;

jQuery.fn.nextTimes = function (n) { 
    return this.nextAll().eq(n); 
} 
+0

謝謝,可惜我不能接受兩個答案。 – Przemek 2012-02-07 13:27:40

1
var next = cell.nextAll(':eq('+n+')'); 
+0

'next()'不能像那樣工作;這將選擇下一個元素* only *如果它匹配選擇器。你應該看到'nextAll()'。 – Matt 2012-02-07 13:05:58

+0

當然。我現在累了 – Hadas 2012-02-07 13:08:05

0

你不說你想要做的,如果當前單元格加上ñ超出當前行的到底是什麼,但在一般意義上,你可以得到由小區指數沒有 jQuery的,如果你使用普通的DOM .cellIndex屬性來獲取當前單元格的索引,然後只需添加ň到和使用結果作爲索引到父tr元素的集合.cells

// given your existing jQuery object for the current cell: 
var cell = $("#cell_4"); 

// cell[0] is the actual DOM element, cell[0].cellIndex is 
// its position within the row, so n cells after is: 
cell[0].parentNode.cells[cell[0].cellIndex + n] 

// or as a jQuery object: 
$(cell[0].parentNode.cells[cell[0].cellIndex + n]) 

或者作爲一個狡猾的jQuery插件,我敢肯定,你可以整理一下:

$.fn.nextTimes = function(n) { 
    var c, i; 
    if (this.length > 0) { 
     c = this[0]; 
     i = c.cellIndex + n; 
     if (i < c.parentNode.cells.length) 
      return $(c.parentNode.cells[i]); 
    } 
    return $([]); 
}; 


var next = cell.nextTimes(n); 

.nextTimes()工作演示:http://jsbin.com/atusiy/2/edit

(顯然.nextAll()可以做的伎倆按照其他的答案,但DOM方法應該更快,如果你做了很多,如果你做了很多,你會想要自己的插件方法......)

相關問題