2012-12-27 23 views
15

Dato una tabella a più colonne, come posso selezionare tutte le celle nella stessa colonna come qualsiasi cella arbitraria (ad esempio una cella su cui si fa clic).jQuery selector per afferrare le celle nella stessa colonna

Qualcosa di simile:

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

ho bisogno di fare questo senza nominare le colonne singolarmente. Per esempio. dovrebbe funzionare sul semplice markup generico table senza classi o ID aggiuntivi.

risposta

21

Il tentativo è giusto, tutto quello che dovete fare è usare .index per trovare la colonna del numero-indice del <td> all'interno della riga. È inoltre necessario utilizzare nth-child-selector per abbinare gli indici delle colonne degli altri elementi <td>.

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

(non sono il downvoter, ma ho avere una domanda :) Il '.eq()' come lo hai ora ora otterrà solo il _nth_ elemento da _all_ il 'td's che corrisponde, quindi otterrà solo quello sulla prima riga. Penso che sia necessario un 'each()' per farlo funzionare? Qualcosa come ... 'find (" tr "). Each (function() {this.find (" td "). Eq (columnNo)});'. C'è un modo più semplice per farlo? – brentonstrine

+1

@brentonstrine Oops. Hai ragione, '.eq' non funzionerà, ma non hai bisogno di un ciclo. Utilizza invece il selettore ['nth-child'] (http://api.jquery.com/nth-child-selector). – nbrooks

+0

Ecco fatto! Grazie. – brentonstrine

4

Questo può essere fatto utilizzando il metodo 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"); 
}); 

Non sono sicuro se questo è il modo più efficiente di farlo, ma è la soluzione mi è venuta di fronte lo stesso problema un po 'indietro.

Riferimento

jQuery.eq

+0

@mplungjan buon suggerimento, aggiornato. Ti chiedi se c'è un modo meno disordinato per ottenere i tds, forse prima? fammelo provare e aggiorna la risposta – Austin

+0

Non funziona come ['.eq()'] (http://api.jquery.com/eq/). * Descrizione: Riduce il set di elementi corrispondenti a quello dell'indice specificato. * Restituisce un oggetto jQuery, * mai * un numero. – nbrooks

+0

Sembra che '.eq()' restituisca un oggetto invece di un numero di indice. il suggerimento di nbrooks di usare 'index()' sembra avere più senso per me. – brentonstrine

Problemi correlati