2009-03-06 10 views
25

Se ho una tabella come mostrato di seguito e ho una freccia su e giù che sposta le righe verso l'alto e verso il basso, come faccio a scambiare le righe in JQuery?Scambio di righe in JQuery

<tr id="Row1"> 
    <td>Some label</td> 
    <td>Some complex control</td> 
</tr> 
<tr id="Row2"> 
    <td>Some label</td> 
    <td>Some complex control</td> 
</tr> 
<tr id="Row3"> 
    <td>Some label</td> 
    <td>Some complex control</td> 
</tr> 

risposta

26
$("#Row1").after($("#Row2")); 

funzionerà

+4

Questo codice mette Row2 dopo Row1. Vedi la documentazione per '$ .after'. –

+2

@DanielAllenLangdon ha ragione - '$ (" # Row1 "). After ($ (" # Row2 "));' non funzionerà. Dovrebbe essere '$ (" # Row2 "). After ($ (" # Row1 "));' o '$ (" # Row1 "). InsertAfter ($ (" # Row2 "));' - vedere: http://api.jquery.com/after/ e http://api.jquery.com/insertAfter/ – rsp

4

Per spostare Row1 un passo verso il basso, faresti:

$me = $("#Row1"); 
$me.after($me.nextSibling()); 
+0

Non è ".nextSibling()" ma ".next()" e sarebbe "$ me". insertAfter ($ me.next()); 'o' $ me.next(). after ($ me); 'perché usa'.after() 'come hai fatto vorrebbe inserire l'elemento nello stesso posto in cui era prima. Comunque la tua risposta ha portato l'idioma più elegante a mio parere, ovvero a '$ me.next(). After ($ me);' - così +1 per quello. :) – rsp

+0

Sintassi molto liscia. Sono solo un po 'sorpreso dalla parte * $ me *. Ho sempre usato la sintassi di * var me = $ ("# qualcosa"); *. Qual è il vantaggio di farlo a modo tuo? (Ho grandi speranze per qualcosa di eccezionale presentato ...) –

1

Vorrei provare :

var tmp = $ ('#Row1') 
$ ('#Row1').remove 
$ ('#Row2').after ($ ('#Row1')) 

Ma suppongo che sia meglio scambiare il contenuto delle righe invece di scambiare le righe da soli, in modo da poter contare sulla numerazione. Quindi,

var tmp = $ ('#Row1').html() 
$ ('#Row1').html ($ ('#Row2').html()) 
$ ('#Row2').html (tmp) 
+0

rimuovere può pasticciare con i gestori di eventi però, quindi provo a evitarlo – cobbal

+0

Oh, grazie per informazioni, sarà attento con esso :-) Il mio secondo esempio fa non usarlo, però. –

60

Ecco un'altra soluzione.

Per spostare una riga verso il basso:

jQuery("#rowid").next().after(jQuery("#rowid")); 

Per spostare una riga verso l'alto:

jQuery("#rowid").prev().before(jQuery("#rowid")); 
+5

Preferisco questo alla risposta accettata perché non è necessario conoscere l'id di un'altra riga (che potrebbe non essere dove si trovava quando la pagina è stata caricata perché le righe sono state spostate). – paulmorriss

+5

Personalmente ho aggiunto i pulsanti all'interno delle celle a questa risposta e uso '$ (this) .closest (" tr "). Next(). After ($ (this) .closest (" tr "));' bound a a $ .click() 'funzione – foochow

1

Sto usando il drag and drop plug-in per cathegories di swap in tabella (con subcathegories), e non dopo lavoro. insertAfter funziona. similiar topic

6

Ecco un esempio un po 'ampliato, sperando che lo troverete utile ... :)

$('table').on('click', '.move-up', function() { 
    var thisRow = $(this).closest('tr'); 
    var prevRow = thisRow.prev(); 
    if (prevRow.length) { 
     prevRow.before(thisRow); 
    } 
}); 

$('table').on('click', '.move-down', function() { 
    var thisRow = $(this).closest('tr'); 
    var nextRow = thisRow.next(); 
    if (nextRow.length) { 
     nextRow.after(thisRow); 
    } 
}); 
0

Ecco il codice per scambiare le righe. Consente di prendere # Row1 e # Row3

$('#Row1').replaceWith($('#Row3').after($('#Row1').clone(true))); 

Il clone (vero) viene utilizzato in modo che gli eventi sono anche presi in considerazione.

Se si desidera spostare la riga su e giù, utilizzare questo codice. Per spostare riga UP

var tableRow = $("#Row1"); 
tableRow.insertBefore(tableRow.prev()); 

Per spostare riga giù

var tableRow = $("#Row1"); 
tableRow.insertAfter(tableRow.next()); 
0

Questa è una funzione generica che ha 3 parametri: riga di origine, riga di destinazione e un booleano che indica se la riga è in movimento su o giù .

var swapTR = function (sourceTR, targetTR, isBefore) { 
    sourceTR.fadeOut(300, function() { 
     sourceTR.remove(); 
     if (isBefore) { 
      targetTR.before(sourceTR); 
     } 
     else { 
      targetTR.after(sourceTR); 
     } 
     sourceTR.fadeIn(300); 
     initializeEventsOnTR(sourceTR); 
    }); 
}; 

Si può usare in questo modo:

swapTR(sourceTR, targetTR, true);