2012-12-27 9 views
15

Bei einer mehrzeiligen, mehrspaltigen Tabelle, wie kann ich alle Zellen in derselben Spalte als beliebige Zelle (z. B. eine Zelle, auf die geklickt wird) auswählen.jQuery-Selektor zum Abrufen von Zellen in derselben Spalte

Etwas wie:

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

Ich muss dies tun, ohne die Spalten einzeln zu benennen. Z.B. Es sollte auf einfache generische table Markup ohne zusätzliche Klassen oder IDs funktionieren.

Antwort

21

Ihr Versuch richtig ist, alles, was Sie tun müssen, ist .index verwenden die Spaltennummer-den Index der <td> innerhalb der Reihe zu finden. Sie müssen auch nth-child-selector verwenden, um die Spaltenindizes der anderen Elemente <td> anzupassen.

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

(Ich bin nicht der downvoter, aber ich habe eine Frage :) Die '.eq()' wie du es jetzt hast, wird nur das _nth_ Element von _all_ den 'td's bekommen, die übereinstimmen, also wird nur das in der ersten Zeile erhalten. Ich denke, es braucht ein 'each()', damit es funktioniert? Etwas wie ... 'finde (" tr "). Je (function() {this.find (" td "). Eq (columnNo)});'. Gibt es einen einfacheren Weg? – brentonstrine

+1

@ Brentonstrine Hoppla! Du hast Recht, '.eq' funktioniert nicht, aber du brauchst keine Schleife. Verwenden Sie stattdessen den [nth-child'] (http://api.jquery.com/nth-child-selector) Selektor. – nbrooks

+0

Das ist es! Vielen Dank. – brentonstrine

4

Dies kann mit der Methode jQuery eq durchgeführt werden.

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"); 
}); 

Nicht sicher, ob dies der effizienteste Weg ist, dies zu tun, aber es ist die Lösung kam ich mit, wenn sie mit dem gleichen Problem vor einiger Zeit konfrontiert.

Referenz

jQuery.eq

+0

@mplungjan guter Vorschlag, aktualisiert. Fragst du dich, ob es einen weniger chaotischen Weg gibt, die Tds zu bekommen, möglicherweise vorher? Lass es mich versuchen und aktualisiere die Antwort. – Austin

+0

So funktioniert ['.eq()'] (http://api.jquery.com/eq/) nicht. * Beschreibung: Reduziert den Satz übereinstimmender Elemente auf den angegebenen Index. * Gibt ein jQuery-Objekt zurück, * nie * eine Zahl. – nbrooks

+0

Es sieht so aus als ob '.eq()' ein Objekt anstelle einer Indexnummer zurückgibt. nbrooks Vorschlag, 'index()' zu verwenden, scheint mir mehr Sinn zu machen. – brentonstrine

Verwandte Themen