2012-12-27 73 views
15

給定一個多行多列表格,我如何選擇與任何任意單元格(例如單擊的單元格)相同的中的所有單元格。jQuery選擇器抓取同一列中的單元格

喜歡的東西:

$("td").click(function(){ 
    var columnNo = $(this).columnNo? 
    $(this).closest("table").find("tr td:eq("+columnNo+")").css("color", "red"); 
}); 

我需要做的這一點沒有單獨命名的列。例如。它應該工作在簡單的通用table標記沒有額外的類或ID ..

回答

21

您的嘗試是正確的,所有你需要做的是使用.index找到列號 - <td>的行內的索引。您還需要使用nth-child-selector來匹配其他<td>元素的列索引。

$("td").click(function(){ 
    var columnNo = $(this).index(); 
    $(this).closest("table") 
     .find("tr td:nth-child(" + (columnNo+1) + ")") 
     .css("color", "red"); 
}); 
+1

(我不是downvoter,而是我有一個問題:) '.eq()'現在你只有從_all_ td's匹配的_nth_元素,因此只會得到第一行的。 我認爲它需要一個'each()'來使它工作?例如...'find(「tr」)。each(function(){this.find(「td」)。eq(columnNo)});'。有沒有更簡單的方法來做到這一點? – brentonstrine

+1

@brentonstrine糟糕。你是對的,'.eq'不起作用,但你不需要循環。改爲使用['nth-child'](http://api.jquery.com/nth-child-selector)選擇器。 – nbrooks

+0

就是這樣!謝謝。 – brentonstrine

4

這可以通過使用jQuery eq方法來完成。

var $tds = $("td"); // get all tds beforehand, so jquery doesn't 
        // need to hit the DOM every click 

$("td").on("click", function() { 
    var position = $(this).index(), 
     $tdsInColumn = $tds.filter(":nth-child(" + index + ")"); 

    // manipulate $tdsInColumn in any way 
    $tdsInColumn.addClass("selected"); 
}); 

不知道這是否是最有效的方式,但是這是我在面對同樣問題時遇到的解決方案。

參考

jQuery.eq

+0

@mplungjan好建議,更新。想知道是否有一個不太麻煩的方式來獲得tds,可能事先?讓我試試並更新答案。 – Austin

+0

這不是['.eq()'](http://api.jquery.com/eq/)的工作原理。 *說明:將匹配元素的集合減少到指定索引處的匹配元素*它返回一個jQuery對象,*從不*數字。 – nbrooks

+0

它看起來像'.eq()'返回一個對象而不是索引號。 nbrooks使用'index()'的建議似乎對我更有意義。 – brentonstrine

相關問題