2012-01-12 13 views
15

Come posso usare jQuery per accedere alla cella (td) immediatamente sotto una data cella in un tradizionale html griglia layout table (cioè, in cui tutte le cellule estendono esattamente una riga e colonna)?jQuery: Get cella successiva tabella verticalmente

So che la segue imposta nextCell alla cella immediatamente a destra della cella cliccato perché sono fratelli immediati, ma sto cercando di recuperare il cellulare immediatamente sotto la cella cliccato:

$('td').click(function() { 
    var nextCell = $(this).next('td'); 
}); 

Preferibilmente mi piacerebbe farlo senza alcun uso di classi o id.

risposta

33

Prova questo:

$("td").click(function(){ 
    // cache $(this); 
    var $this = $(this); 

    // First, get the index of the td. 
    var cellIndex = $this.index(); 

    // next, get the cell in the next row that has 
    // the same index. 
    $this.closest('tr').next().children().eq(cellIndex).doSomething(); 
}); 
+1

Non hai bisogno dell'argomento ''td'' per i bambini, e potresti buttarlo via se l'OP ha [' th' elementi] (http://jsfiddle.net/nX7JP/) nella tabella. – Dennis

0

C'è un numero uguale di celle in ogni riga della tabella? In tal caso, è possibile ottenere il "conteggio" della cella in questione, quindi selezionare la cella corrispondente in next('tr').

1

ne dite:

$('td').click(function() { 
    var nextCell = $(this).parent().next().find("td:nth-child(whatever)"); 
}); 
2
$('td').click(function() { 
    var index = $(this).prevAll().length 
    var cellBelow = $(this).parent().next('tr').children('td:nth-child(' + (index + 1) + ')') 
}); 

index è l'indice 0-based della cella della riga corrente (prevAll trova tutte le celle prima di questo).

Quindi nella riga successiva, troviamo il nth-child td all'indice + 1 (nth-child inizia da 1, quindi + 1).

+1

Perché '$ (this) .prevAll(). Length' su' $ this.index() '? –

+0

@JustinSatyr Non sapevo di "index" fino ad ora. :) – mbillard

+1

Non ho mai pensato di usare .prevAll(). Length. haha. Lo stesso risultato, non ho idea di quale sia più veloce. –

1

Se si vuole fare senza usare i selettori, si può fare:

function getNextCellVertically(htmlCell){ 
     //find position of this cell.. 
     var $row = $(htmlCell).parent(); 
     var cellIndex = $.inArray(htmlCell, $row[0].cells); 
     var table = $row.parent()[0]; 
     var rowIndex = $.inArray($row[0], table.rows); 

     //get the next cell vertically.. 
     return (rowIndex < table.rows.length-1) ? 
       table.rows[rowIndex+1].cells[cellIndex] : undefined; 
    } 

    $('td').click(function() { 
     var nextCell = getNextCellVertically(htmlCell); 
     //... 
    }); 

Non che l'efficienza è importante qui, ma funziona molto più veloce per farlo in questo modo - nei test oltre 100.000 iterazioni Era 2-5 volte più veloce degli approcci basati sul selettore.

Problemi correlati