2009-03-06 2 views
25

Если у меня есть таблица, как показано ниже, а также стрелка вверх и вниз, которая перемещает строки вверх и вниз, как мне пойти на замену строк в JQuery?Перемещение строк в 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> 

ответ

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

будет работать

+4

Этот код помещает row2 после Row1. См. Документацию для '$ .after'. –

+2

@DanielAllenLangdon прав - '$ (" # Row1 "). After ($ (" # Row2 "));' не будет работать. Он должен быть либо '$ (" # Row2 "). After ($ (" # Row1 "));' или '$ (" # Row1 "). InsertAfter ($ (" # Row2 "));' - см: http://api.jquery.com/after/ и http://api.jquery.com/insertAfter/ – rsp

4

Чтобы переместить Row1 один шаг вниз, вы могли бы сделать:

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

Это не '.nextSibling()', а '.next()', и это будет либо '$ me. insertAfter ($ me.next()); 'или' $ me.next(). after ($ me); 'потому что используется'.after() ', как вы делали, вставляет элемент в том же месте, что и раньше. По-моему, ваш ответ привел к самой изящной идиоме, по-моему, к '$ me.next(). After ($ me);' - так +1 для этого. :) – rsp

+0

Очень плавный синтаксис. Я немного удивлен частью * $ me *. Я всегда использовал синтаксис * var me = $ ("# something"); *. В чем преимущество этого? (У меня большие надежды на что-то потрясающее, представленное ...) –

1

Я хотел бы попробовать :

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

Но я думаю, что лучше менять содержимое строк вместо того, чтобы сами менять строки, чтобы вы могли полагаться на нумерацию. Таким образом,

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

удалить может беспорядок с обработчиками событий, хотя, поэтому я стараюсь избегать этого – cobbal

+0

О, спасибо за информацию, будьте осторожны с ним :-) Мой второй пример не использовать его. –

60

Вот еще одно решение.

Чтобы переместить строку вниз:

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

Чтобы переместить строку вверх:

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

Я предпочитаю это принятому ответу, потому что вам не нужно знать идентификатор другой строки (которая может быть не там, где была загружена страница, потому что строки были перемещены). – paulmorriss

+5

Лично я добавил к этому ответу кнопки внутри ячеек и использовал '$ (this) .closest (" tr "). Next(). After ($ (this) .closest (" tr "));' привязан к '$ .click() 'функция – foochow

1

Я использую перетащить плагин для подкачки срезании в таблице (с subcathegories), и после того, как не за работой. insertAfter работает. similiar topic

6

Вот несколько расширен пример, надеясь, что вы найдете его полезным ... :)

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

Вот код, чтобы поменять местами строки. Позволяет принимать # Row1 и # Row3

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

клон (правда) используется так, что события, также принимаются во внимание.

Если вы хотите перемещать строку вверх и вниз, используйте этот код. Чтобы переместить строку ВВЕРХ

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

Чтобы переместить строку вниз

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

Это общая функция, которая имеет 3 параметра: исходный ряд, целевую строку и логическое значение, указывающее, если строка движется вверх или вниз ,

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

Вы можете использовать его таким образом:

swapTR(sourceTR, targetTR, true); 
Смежные вопросы