В сервисе Google «Вопросы и ответы» одним пользователем был задан этот вопрос и, к моему удивлению, очень долго никто не давал на него ответа. А на самом деле эта задача очень просто решается благодаря встроенному методу serialize.
Сейчас я хочу разобрать только основную функцию программы:
Сохраняем ссылку на корневой элемент сортируемого списка. Он не однократно потребуется нам в дальнейшем. Хоть эта функция и работает очень быстро, но так получить доступ можно будет еще быстрее.
var root = $('#items');
Назначаем всем элементам списка уникальные идентификаторы. Это обязательное условие правильной работы метода serialize . Префикс может быть произвольным, но в наших интересах, чтобы он был как можно короче. В качестве разделителя можно использовать символы подчеркивание, равенство или дефис.
$('> *', root).each(function (index) {
this.id = 'item-' + index;
});
Инициализируем виджет Sortable и перехватываем событие update, чтобы сохранять состояние списка.
root.sortable({
'update': function (event, ui) {
var order = $(this).sortable('serialize');
$.cookies.set('sortable', order);
}
});
Восстанавливаем порядок элементов списка после загрузки страницы.
var c = $.cookies.get('sortable');
if (c) {
$.each(c.split('&'), function () {
var id = this.replace('[]=', '-');
$('#' + id).appendTo(root);
});
}
Пробегаемся по всем элементам, сохраненным в cookie , и перемещаем их в конец списка. Если был сохранен порядок для всех элементов, то они естественным образом займут свои места. Если для каких-то элементов позиция не сохранялась, то они «всплывут» наверх списка.
Отдельно хочу заметить, что в этом примере вместо штатного API для доступа к cookies использовался плагин, который значительно облегчил работу с ними.
Коментарии к заметке
А можно узнать как сделать так, что бы это записать не в cookie, а в базе данных в mysql?
В обработчике события
update
сделайте что-либо наподобие:На сервере по URL /sortable/save пишете код, который разбирает содержимое параметра
sortable
и записывает эти данные в базу. В запросе так же нужно учитывать значение параметраtimestamp
. Из-за того, что запросы на сервере могут приходить в случайном порядке, нужно отбрасывать «старые», у который значениеtimestamp
будет меньше, чем уже записанное в базу.Так же рекомендую почитать статью про контроль скорости вызова функций . Возможно, потребуется ограничить количество посылаемых запросов в единицу времени, чтобы не перегружать сервер.
Было бы понятнее если б был всесь код страницы!
Благодарю — простое но эффективное решение. p.s. загружать базу индивидуальными предпочтениями думаю не стоит. куки прекрасно под это подойдут.
и насчет порядка (точнее его восстановления) — если после перезагрузки новые элементы будут не в конце списка а вперемешку со старыми — то это не сработает конечно. (в моем случае, впрочем, в этом нет необходимости)
подскажите как сделать правильно, если хочу использовать не идентификатор элемента, а другой атрибут, например, order. Как присвоить этот атрибут и его значение к элементу мне понятно, но вот как записать в куки?
Добавил некоторые изменения, чтобы позиции сохранялись на определенной странице.
Хотел так же узнать при движение элемента можно ли изменить свойство элемента, к примеру присвоить тень. Одним словом нужно изменить css свойство элемента.
Конечно можно. Как минимум, у элемента, который тащат в текущий момент, появляется класс
ui-sortable-helper
. Так же виджет будет генерировать различные события. На них можно повесить обработчики с какой-то более сложной логикой. Читайте документацию.