Вы находитесь на устаревшей версии сайта romka.eu. Она оставлена здесь на случай если я захочу поностальгировать по тому как выглядел интернет в 2012 году :) Так этот сайт выглядел с июня 2012 по февраль 2023. Эта версия сайта не обновляется, комментирование материалов отключено. Обновленная версия сайта доступна по адресу http://romka.eu.

Перетаскивание строк таблицы. Table drag and drop — плагин для jQuery

Submitted by Ромка on Пнд, 01/09/2008 - 23:31

Ромка аватар
12754
Vote up!
В своем модуле "Адаптивное меню" я использовал очень удобный плагин для библиотеки jQuery, который позволяет сортировать ячейки таблиц, перетаскивая их мышью. Сейчас я хочу подробнее рассказать о возможностях этого плагина.

Для работы необходимо скачать последнюю версию библиотеки jQuery, последнюю версию плагина Table DnD. Также можно ознакомиться с официальной документацией к плагину.

Свойства "Table drag and drop"

После подключения, плагин добавляет к функционалу jQuery возможность использовать функцию tableDnD(), принимающую следующие параметры :
  • onDragStyle — CSS-стиль перетаскиваемой строки;
  • onDropStyle — стиль строки, после того как ее перетащили;
  • onDragClass — по сути то же что и onDragStyle, но вместо стилей указывается класс, содержащий необходимые стили;
  • onDrop — функция, выполняемая после того как строчку "бросили";
  • onDragStart — функция, выполняемая после того как строчку начали перетаскивать;
  • dragHandle — здесь определяется класс ячейки, за которую можно будет перетаскивать строчку. Если параметр не определен, то хватать строку можно будет за любую ячейку;
  • scrollAmount — число пикселей, на которое проскроллится страница, в случае если во время перетаскивания курсор дойдет до верхней или нижней границы страницы.

Простой пример работы

1 One some text
2 Two some text
3 Three some text
4 Four some text
5 Five some text
6 Six some text

В этом примере включается перетаскивание строк для таблицы с id="table-1" и перетаскиваемым ячейкам назначается класс "myDragClass". Для работы примера необходимо подключить jQuery, плагин "Table drag and drop", файл со скриптом реализующим логику и файл со стилями:
Исходник файла table-dnd-example.js для этого примера: $(document).ready(function() { $("#table-1").tableDnD({ onDragClass: "myDragClass" }); });
Таблица из примера выглядит так:
1Onesome text
2Twosome text
3Threesome text
4Foursome text
5Fivesome text
6Sixsome text

Теперь немного более сложный пример — разрешаем перетаскивать строки только за крайнюю ячейку, в которой при наведении курсора выводится иконка-подсказка:
6 Six some text
1 One some text
2 Two some text
3 Three some text
4 Four some text
5 Five some text

Таблица из второго примера, обратите внимание на то, что первой ячейке каждой строки присвоен класс dragHandle:
6Sixsome text
1Onesome text
2Twosome text
3Threesome text
4Foursome text
5Fivesome text

Этим скриптом разрешаем таскать строки только за ячейку с классом dragHandle, а также при наведении курсора на строчку выводим в первой ячейке иконку-подсказку (для этого добавляем/удаляем класс showDragHandle): $(document).ready(function() { // Initialise the table $("#table-2").tableDnD({ onDragClass: "myDragClass", dragHandle: "dragHandle" }); $("#table-2 tr").hover(function() { $(this.cells[0]).addClass('showDragHandle'); }, function() { $(this.cells[0]).removeClass('showDragHandle'); }); });


Передача данных на сервер

Без возможности сохранить сделанные пользователем изменения плагин был бы простой игрушкой. В этом примере клиентский скрипт передаст серверному информацию о последовательности строк и выведет на экран ответ сервера.
Тут будет ответ от сервера
1Onesome text
2Twosome text
3Threesome text
4Foursome text
5Fivesome text
6Sixsome text

Для работы примера необходимо каждой строке присвоить уникальный id. В слое upd-dnd будет выводиться ответ сервера:
Тут будет ответ от сервера
1Onesome text
2Twosome text
3Threesome text
4Foursome text
5Fivesome text
6Sixsome text

Чтобы получить возможность обработать массив строк необходимо повесить свою функцию на событие onDrop, делается это так:$(document).ready(function() { // Initialise the table 3 $("#table-3").tableDnD({ onDragClass: "myDragClass", onDrop: function(table, row) { var rows = table.tBodies[0].rows; var w = ""; // В цикле создаем разделенный символом ";" список, в котором последовательно размещены id строк for (var i = 0; i < rows.length; i++) { w += rows[i].id + ";"; } // Передаем данные на сервер $.ajax({ type: "POST", url: "table-dnd-example.php", timeout: 5000, data: "w=" + w, success: function(data){$("div#upd-dnd").html(data);}, error: function(data){$("div#upd-dnd").html("Error");} }); } }); });
PHP-backend здесь простой, он просто отдает клиентской части строку, которую получил, предварительно ее отформатировав. В реальном случае входной массив придется сохранить. Rows:

Все примеры на одной странице тут.
Архив с примерами использования Table DnD.

23 Comments

Это можно сделать следущим

Это можно сделать следущим способом:
Дописать к функции в событии onDrop код:

  1. // найти все четные tr в в элемменте с id = table-1 и изменить цвет бэкграунда
  2. $("#table-1 tr:even").css({backgroundColor: "gray"});
  3. // тоже самое только с нечетными tr
  4. $("#table-1 tr:odd").css({backgroundColor: "black"});

А можно ли сделать так, чтобы

А можно ли сделать так, чтобы после окончания перетаскивания элементы не сдвигались на 1 позицию, а менялись местами? Типа, я взял 6-й элемент и перетащил его на место 2-го. При этом 2-й должен стать на место 6-го.

table { } td, th { } th

table {

}
td, th {

}
th {

}
td {

}
.even {
//тут цвет нужный для каждой второй строки
}

-------------------------------------------------------

$(document).ready(function( ) {
$('table.striped tr:even').addClass('even');
});

-------------------------------------------------------

Re

Did you ever hear about freelance writing jobs ? I want to say that the stuff just about this post is very hot! Thank you for producing that!

Спасибо за информацию

Спасибо за информацию классный плагин. Жалко, что этот плагин дальше не развивается. Очень было бы прикольно если бы была поддержка перетаскивания в другую таблицу таким образом можно было бы делать под категории. А нету других похожих плагинов?

спс за статью

спс за статью

самое обидное что єто не

самое обидное что єто не работает с динамически добавленными строками :(

Работает. После добавления

Работает. После добавления нужно повторно вызвать метод $().tableDnD. А вот метод $().tableDnDUpdate, который описан в мануале, не работает. Да, и добавлять строки в таблицу можно только через appendChild(), а не innerHTML, иначе вообще никакой скрипт не будет работать нормально.

А я вот думаю...

как бы сделать так чтобы эта хрень, работала следующим образом, есть родительские строки, а есть дочерние.. вот как сделать так чтобы родительскую берешь, она вместе с дочерними перемещалась.

Пойду рыться в коде и перепаивать плагин. Если у кого есть быстрое решение скиньте плз на мыло.

Кстати для комментов полезно было бы сделать чтобы http:// прописывались сами если не введено )))

Вложенные таблицы по идее

Вложенные таблицы по идее должны работать. Зачем изобретать велосипед?

Мысль такая...после переноса

Мысль такая...после переноса строки его порядковый номер меняется- как это сделать??
Напрмер:
ДО
№ | username |
1 | user1 |
....
6 | user6 |

После

№ | username |
1 | user6 |
2 | user1 |
...

zinny, если получилось

zinny, если получилось изменить порядковый номер - то объясните, пожалуйста, как сделали.
Очень нужно.
Заранее спасибо.
Ответ можно и на почту - nik_neman@mail.ru

Сохранение порядка строк

А можно более простым способом реализовать сохранение порядка строк (сработает для РНР):

в каждой строке таблицы, в любом месте добавляем

<input type='hidden' name="order[]=<?=$row->id?>" />

Таким образом при отправке формы данные придут на сервер в порядке расположения строк:

$_POST['order'][0] == 2;  $_POST['order'][1] == 3;  $_POST['order'][2] == 1;

respond this topic

Some time before, I needed to buy a building for my organization but I did not have enough cash and could not order something. Thank God my brother proposed to try to take the business loans from trustworthy bank. Therefore, I acted that and was happy with my collateral loan.

Подскажите как получить

Подскажите как получить массив строк в случаи если таблица:

  1. <table id="table-4" cellspacing="0" cellpadding="2">
  2. <tbody>
  3. <tr class="nodrop nodrag">
  4. <th>H1</th>
  5. <th>H2</th>
  6. <th>H3</th>
  7. </tr>
  8.  
  9. <tr id="1">
  10. <td>1</td>
  11. <td>1</td>
  12. <td>
  13. </tr>
  14.  
  15. <tr id="2">
  16. <td>2</td>
  17. <td>2</td>
  18. <td>
  19. </tr>
  20.  
  21. </tbody>
  22.  
  23. <tbody>
  24. <tr class="nodrop nodrag">
  25. <th>H1</th>
  26. <th>H2</th>
  27. <th>H3</th>
  28.  
  29. </tr>
  30. <tr id="3">
  31. <td>3</td>
  32. <td>3</td>
  33. </tr>
  34.  
  35. <tr id="4">
  36. <td>4</td>
  37. <td>4</td>
  38. <td>
  39. </tr>
  40. </tbody>
  41.  
  42. <tbody>
  43.  
  44. <tr class="nodrop nodrag">
  45. <th>H1</th>
  46. <th>H2</th>
  47. <th>H3</th>
  48. </tr>
  49.  
  50. <tr id="5">
  51. <td>5</td>
  52. <td>5</td>
  53. <td>
  54. </tr>
  55. <tr id="6">
  56. <td>6</td>
  57. <td>6</td>
  58. <td>
  59. </tr>
  60. </tbody>
  61. </table>

при таком подсчете строк

  1. for (var i = 0; i < rows.length; i++) {
  2. w += rows[i].id + ";";
  3. }

Получаю: ;1;2;

несколько td в строчке

День добрый.
Вот допустим у меня такая структура таблицы:

1
2
3

4
5
6

Как сделать чтобы менялись ячейки 1 и 3 допустим?
Точней чтобы менялись ни а .
Заранее спасибо.

Просьба помочь. Не могу

Просьба помочь. Не могу понять, почему не работает изменение фона после перетаскивания строки

tr.myDropClass td{
background-color: #FF9900;
}