2012-12-27 18 views
15

Với bảng nhiều cấp, nhiều cột, làm cách nào tôi có thể chọn tất cả các ô trong cùng một cột làm bất kỳ ô tùy ý nào (ví dụ: ô được nhấp vào).Bộ chọn jQuery để lấy các ô trong cùng một cột

Cái gì như:

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

tôi cần phải làm điều này mà không cần đặt tên cho các cột riêng. Ví dụ. nó nên làm việc trên đánh dấu đơn giản chung table mà không cần thêm lớp học hoặc ID.

Trả lời

21

nỗ lực của bạn là đúng, tất cả các bạn cần làm là sử dụng .index để tìm cột số-chỉ số của <td> trong hàng. Bạn cũng cần phải sử dụng nth-child-selector để khớp các chỉ mục cột của các phần tử <td> khác.

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

(Tôi không phải là kẻ phá hủy, nhưng tôi có một câu hỏi :) '.eq()' như bạn có nó bây giờ sẽ chỉ nhận được phần tử _nth_ từ _all_ 'td' khớp, do đó chỉ có được một ở hàng đầu tiên. Tôi nghĩ rằng nó cần một 'each()' để làm cho nó hoạt động? Một cái gì đó giống như ... 'find (" tr "). Each (function() {this.find (" td "). Eq (columnNo)});'. Có cách nào đơn giản hơn để làm điều đó không? – brentonstrine

+1

@brentonstrine Rất tiếc. Bạn nói đúng, '.eq' sẽ không hoạt động, nhưng bạn không cần một vòng lặp. Sử dụng công cụ chọn ['nth-child'] (http://api.jquery.com/nth-child-selector) để thay thế. – nbrooks

+0

Đúng rồi! Cảm ơn. – brentonstrine

4

Điều này có thể được thực hiện bằng phương pháp 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"); 
}); 

Không chắc chắn đây là cách hiệu quả nhất để làm như vậy, nhưng đó là giải pháp tôi đưa ra khi đối mặt với cùng một vấn đề trong khi quay trở lại.

Reference

jQuery.eq

+0

@mplungjan đề xuất hay, cập nhật. Tự hỏi nếu có một cách ít lộn xộn để có được các tds, có thể trước? hãy để tôi thử và cập nhật câu trả lời. – Austin

+0

Đây không phải là cách ['.eq()'] (http://api.jquery.com/eq/) hoạt động. * Mô tả: Giảm tập hợp các phần tử đã so khớp thành một phần tử tại chỉ mục được chỉ định. * Nó trả về một đối tượng jQuery, * không bao giờ * một số. – nbrooks

+0

Dường như '.eq()' trả về một đối tượng thay vì một số chỉ mục. nbrooks gợi ý sử dụng 'index()' có vẻ hợp lý hơn với tôi. – brentonstrine

Các vấn đề liên quan