2009-03-06 27 views
25

Si tengo una tabla como la que se muestra a continuación, y tengo una flecha hacia arriba y hacia abajo que mueve las filas hacia arriba y hacia abajo, ¿cómo podría intercambiar filas en JQuery?Intercambio de filas en 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> 

Respuesta

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

trabajará

+4

Este código pone Row2 después ROW1. Consulte la documentación de '$ .after'. –

+2

@DanielAllenLangdon tiene razón - '$ (" # Row1 "). After ($ (" # Row2 "));' no funcionará. Debería ser '$ (" # Row2 "). After ($ (" # Row1 "));' o '$ (" # Row1 "). InsertAfter ($ (" # Row2 "));' - ver: http://api.jquery.com/after/ y http://api.jquery.com/insertAfter/ – rsp

4

Para mover ROW1 un paso hacia abajo, que haría:

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

No es '.nextSibling()' pero '.next()' y sería '$ me. insertAfter ($ me.next()); 'o' $ me.next(). after ($ me); 'porque usando'.after() 'como lo hizo insertaría el elemento en el mismo lugar que estaba antes. Aún así, su respuesta llevó a la expresión más elegante en mi opinión, a saber, '$ me.next(). After ($ me);' - así que +1 para eso. :) – rsp

+0

Sintaxis muy suave. Estoy un poco sorprendido por la parte * $ me *. Siempre he usado la sintaxis de * var me = $ ("# something"); *. ¿Cuál es la ventaja de hacerlo a tu manera? (Tengo muchas esperanzas de que se presente algo increíble ...) –

1

me gustaría probar :

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

Pero supongo que es mejor intercambiar el contenido de las filas en lugar de intercambiar las filas, para que pueda contar con la numeración. Por lo tanto,

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

eliminar puede molestar a los controladores de eventos, así que trato de evitarlo – cobbal

+0

Gracias por la información, tendré cuidado con esto :-) Mi segundo ejemplo no no lo use, sin embargo. –

60

Aquí hay otra solución.

Para mover una fila hacia abajo:

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

Para mover una fila hacia arriba:

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

Prefiero esto a la respuesta aceptada porque no necesita conocer el ID de otra fila (que puede no estar donde estaba cuando se cargó la página porque las filas se han movido). – paulmorriss

+5

Personalmente agregué botones dentro de las celdas a esta respuesta y uso '$ (this) .closest (" tr "). Next(). After ($ (this) .closest (" tr "));' unido a '' $ Función .click() ' – foochow

1

estoy usando arrastrar y soltar plug-in para establecerán categorías de intercambio en la tabla (con subcathegories), y después de no trabajando. InsertAfter works. similiar topic

6

Aquí está un ejemplo un poco ampliado, con la esperanza de que será de gran utilidad ... :)

$('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

Este es el código para intercambiar las filas. Deja la toma # ROW1 y # Row3

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

El clon (verdadero) se utiliza para que los eventos también se tienen en cuenta.

Si desea mover la fila hacia arriba y hacia abajo, utilice este código. Para mover fila UP

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

Para mover fila hacia abajo

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

Esta es una función genérica que tiene 3 parámetros: fila de origen, fila de destino y un valor booleano que indica si la fila se mueve hacia arriba o hacia abajo .

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

Usted puede usarlo de esta manera:

swapTR(sourceTR, targetTR, true); 
Cuestiones relacionadas