Перетаскивание строк таблицы. Table drag and drop — плагин для jQuery
Submitted by Ромка on Пнд, 01/09/2008 - 23:31
В своем модуле "Адаптивное меню" я использовал очень удобный плагин для библиотеки jQuery, который позволяет сортировать ячейки таблиц, перетаскивая их мышью. Сейчас я хочу подробнее рассказать о возможностях этого плагина.
Для работы необходимо скачать последнюю версию библиотеки jQuery, последнюю версию плагина Table DnD. Также можно ознакомиться с официальной документацией к плагину.
В этом примере включается перетаскивание строк для таблицы с id="table-1" и перетаскиваемым ячейкам назначается класс "myDragClass". Для работы примера необходимо подключить jQuery, плагин "Table drag and drop", файл со скриптом реализующим логику и файл со стилями:
Исходник файла table-dnd-example.js для этого примера:
Таблица из примера выглядит так:
Теперь немного более сложный пример — разрешаем перетаскивать строки только за крайнюю ячейку, в которой при наведении курсора выводится иконка-подсказка:
Таблица из второго примера, обратите внимание на то, что первой ячейке каждой строки присвоен класс dragHandle:
Этим скриптом разрешаем таскать строки только за ячейку с классом dragHandle, а также при наведении курсора на строчку выводим в первой ячейке иконку-подсказку (для этого добавляем/удаляем класс showDragHandle):
Для работы примера необходимо каждой строке присвоить уникальный id. В слое upd-dnd будет выводиться ответ сервера:
Чтобы получить возможность обработать массив строк необходимо повесить свою функцию на событие onDrop, делается это так:
PHP-backend здесь простой, он просто отдает клиентской части строку, которую получил, предварительно ее отформатировав. В реальном случае входной массив придется сохранить.
Все примеры на одной странице тут.
Архив с примерами использования Table DnD.
Для работы необходимо скачать последнюю версию библиотеки 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"
});
});
Таблица из примера выглядит так:
1 One some text
2 Two some text
3 Three some text
4 Four some text
5 Five some text
6 Six some 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:
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, а также при наведении курсора на строчку выводим в первой ячейке иконку-подсказку (для этого добавляем/удаляем класс 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');
});
});
Передача данных на сервер
Без возможности сохранить сделанные пользователем изменения плагин был бы простой игрушкой. В этом примере клиентский скрипт передаст серверному информацию о последовательности строк и выведет на экран ответ сервера.Тут будет ответ от сервера
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. В слое upd-dnd будет выводиться ответ сервера:
Тут будет ответ от сервера
1 One some text
2 Two some text
3 Three some text
4 Four some text
5 Five some text
6 Six some 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
А можно настроить так, чтобы
Submitted by Snowcore (не проверено) on
А можно настроить так, чтобы цвет строк менялся при перетаскивании? (в смысле соблюдалась зебра)
Это можно сделать следущим
Submitted by Anonymous (не проверено) on
Это можно сделать следущим способом:
Дописать к функции в событии onDrop код:
А можно ли сделать так, чтобы
Submitted by Виталик (не проверено) on
А можно ли сделать так, чтобы после окончания перетаскивания элементы не сдвигались на 1 позицию, а менялись местами? Типа, я взял 6-й элемент и перетащил его на место 2-го. При этом 2-й должен стать на место 6-го.
Как раскрасить в шахматный
Submitted by Сергей (не проверено) on
Как раскрасить в шахматный порядок таблицу?
table { } td, th { } th
Submitted by GGSimon (не проверено) on
table {
}
td, th {
}
th {
}
td {
}
.even {
//тут цвет нужный для каждой второй строки
}
-------------------------------------------------------
$(document).ready(function( ) {
$('table.striped tr:even').addClass('even');
});
-------------------------------------------------------
Перетаскивание нескольких строк
Submitted by Anonymous (не проверено) on
А как перетащить сразу несколько строк, выделенных, например, через ctrl?
Хорошая статья. то что мне
Submitted by Anton as T3Leads (не проверено) on
Хорошая статья. то что мне надо. Спасибо.
Re
Submitted by Jessica24 (не проверено) on
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!
Спасибо за информацию
Submitted by Anonymous (не проверено) on
Спасибо за информацию классный плагин. Жалко, что этот плагин дальше не развивается. Очень было бы прикольно если бы была поддержка перетаскивания в другую таблицу таким образом можно было бы делать под категории. А нету других похожих плагинов?
спс за статью
Submitted by Дмитрий (не проверено) on
спс за статью
Материал суперовый.
Submitted by Anonymous (не проверено) on
Большое спасибо автору! +1 в закладки
самое обидное что єто не
Submitted by anna (не проверено) on
самое обидное что єто не работает с динамически добавленными строками :(
Работает. После добавления
Submitted by Anonymous (не проверено) on
Работает. После добавления нужно повторно вызвать метод $().tableDnD. А вот метод $().tableDnDUpdate, который описан в мануале, не работает. Да, и добавлять строки в таблицу можно только через appendChild(), а не innerHTML, иначе вообще никакой скрипт не будет работать нормально.
А я вот думаю...
Submitted by Rantie (не проверено) on
как бы сделать так чтобы эта хрень, работала следующим образом, есть родительские строки, а есть дочерние.. вот как сделать так чтобы родительскую берешь, она вместе с дочерними перемещалась.
Пойду рыться в коде и перепаивать плагин. Если у кого есть быстрое решение скиньте плз на мыло.
Кстати для комментов полезно было бы сделать чтобы http:// прописывались сами если не введено )))
Вложенные таблицы по идее
Submitted by Anonymous (не проверено) on
Вложенные таблицы по идее должны работать. Зачем изобретать велосипед?
а из вложенной в родительскую
Submitted by Rantie (не проверено) on
а из вложенной в родительскую тоже должно работать?
Мысль такая...после переноса
Submitted by zinny (не проверено) on
Мысль такая...после переноса строки его порядковый номер меняется- как это сделать??
Напрмер:
ДО
№ | username |
1 | user1 |
....
6 | user6 |
После
№ | username |
1 | user6 |
2 | user1 |
...
zinny, если получилось
Submitted by nik_neman (не проверено) on
zinny, если получилось изменить порядковый номер - то объясните, пожалуйста, как сделали.
Очень нужно.
Заранее спасибо.
Ответ можно и на почту - nik_neman@mail.ru
Сохранение порядка строк
Submitted by Мурад (не проверено) on
А можно более простым способом реализовать сохранение порядка строк (сработает для РНР):
в каждой строке таблицы, в любом месте добавляем
<input type='hidden' name="order[]=<?=$row->id?>" />
Таким образом при отправке формы данные придут на сервер в порядке расположения строк:
$_POST['order'][0] == 2; $_POST['order'][1] == 3; $_POST['order'][2] == 1;
respond this topic
Submitted by loan (не проверено) on
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.
Подскажите как получить
Submitted by One (не проверено) on
Подскажите как получить массив строк в случаи если таблица:
при таком подсчете строк
Получаю: ;1;2;
несколько td в строчке
Submitted by nik_neman (не проверено) on
День добрый.
Вот допустим у меня такая структура таблицы:
1
2
3
4
5
6
Как сделать чтобы менялись ячейки 1 и 3 допустим?
Точней чтобы менялись ни а .
Заранее спасибо.
Просьба помочь. Не могу
Submitted by Роман (не проверено) on
Просьба помочь. Не могу понять, почему не работает изменение фона после перетаскивания строки
tr.myDropClass td{
background-color: #FF9900;
}