css, html, php, javascript, jQuery, ajax … – решения, примеры, рецепты
6 Фев
Сортировка таблиц – очень часто встречающаяся задача при построении пользовательских интерфейсов. Давайте посмотрим как легко и просто решается задача сортировки таблиц на стороне клиента с помощью библиотеки jQuery.
Испытайте этот небольшой пример, а затем мы разберем как это сделано.
Вы можете скачать исходный код примера, и при наличии библиотеки jQuery воспроизвести это пример на своем сайте.
В раздел HEAD понадобится подключить всего два файла: библиотеку jQuery – jquery-1.2.1.js и файл ui.tablesorter.js
<script type="text/javascript" src="js/jquery-1.2.1.js"></script> <script type="text/javascript" src="js/ui.tablesorter.js"></script>
В исходном коде примера Вы сможете посмотреть стилевую таблицу, отвечающую за отображение календаря и при необходимости отредактировать ее под свой дизайн. Эта часть кода выделена комментариями /* Стили для таблицы */.
HTML-код не представляет собой ничего интересного – это обычная таблица. Обращу внимание разве что на необходимость использования тэгов thead и tbody.
И наконец приведу очень простой код, который будет вызывать UI Tablesorter:
<script type="text/javascript">
$(document).ready(function(){
$("#example").tablesorter({
widgets: ["zebra"],
sortList:[[1,0]]
});
});
</script>
Таблица с идентификатором #example будет сортируемой. Большинство опций сортировки задано по умолчанию в самом файле ui.tablesorter.js, но мы легко можем их переопределить.
widgets: ["zebra"] – используем «фирменный» виджет, чтобы чередовать цвет строк в таблице.
sortList:[[1,0]] – задаем сортировку по умолчанию (при загрузке). В этом примере – сортировка второго столбца по возрастанию (первая цифра – порядковый номер столбца, вторая порядок сортировки, где 0 – по возрастанию, 1 – по убыванию). Здесь можно задавать сортировку и по нескольким столбцам сразу. Например: sortList:[[1,0], [0,1]] – сначала второй столбец сортируется по возрастанию, а затем первый – по убыванию…
Приведу еще пару полезных опций.
sortMultisortKey – по умолчанию задано значение shiftKey, т.е. щелкая мышью по заголовку столбца при нажатой клавише Shift можно выполнять сортировку по нескольким столбцам. Естественно клавишу можно переопределить. Например так: sortMultiSortKey: «ctrlKey». Теперь можно работать через клавишу Ctrl.
headers – с помощью этой опции можно запретить сортировку по отдельным столбцам. Например: headers: { 4: { sorter: false} } запретит сортировку пятого столбца.
Весь список опций есть на сайте разработчиков библиотеки, а я буду благодарен, если найдете возможность оставить свои отзывы…
Отзывов (66) на «Пользовательские интерфейсы jQuery: tablesorter – сортировка таблиц.»
Спасибо! Классная вещь.
Но есть маленькое «но» которое меня интересует.
сортировка происходит, если значения в ячейках есть статические данные.
К примеру в одном из столбцов у меня отображаются динамические данные, а именно в ячейку вставляю код в этом случае сортировка происходит не по выводимому значению, а по имени ссылки скрипта, например /informer/15, /informer/16 …….
Хотелось бы узнать у Авторов, возможно что-то добавить в скрипт (jQuery), чтобы сортировка производилась по получаемым данным из вставляемого мною кода javascript. ?
Заранее Благодарен!
Что Вы имеете ввиду, говоря о динамических данных? Здесь сортировка осуществляется javascript-кодом, т.е. все действия происходят исключительно на стороне клиента. Если у Вас в ячейках таблицы имеются ссылки на какие-либо данные, то это именно ссылки, а вовсе не сами данные.
А вот если например с помощью Ajax запросить данные с сервера (вот тут-то он Вам их и сформирует динамически), получить ответ и вставить обновленные данные в ячейки таблицы, то вполне можно будет сортировать таблицу с учетом уже обновленных данных.
———————————–
P.S. Да, кстати, насчет узнать у Авторов… Я, если честно, лично с John Resig and the jQuery team не знаком….
C Ajax не знаком….., Скажите, если Вам не займет много труда и времени, как с помощью Ajax возможно произвести данную операцию…..
Данные (значение рейтинга статьи) вытягиваю в виде жава кода, или могу в виде кода условного оператора $значение_а$. этот код вставляю в ячейку.
Заранее Вам благодарен.
Разработчики библиотеки jQuery дали возможность использовать прелести ajax-запросов без глубокого понимания процессов, которые происходят во время этого. Почитайте эту статью:
http://www.linkexchanger.su/2008/34.html
Вы просто для себя поймете, что использование AJAX в jQuery – это далеко не так сложно. Ну а общие принципы я описывал в предыдущем посте. Все-таки я вряд ли в комментариях смогу развернуто объяснить что и как. Так что статья все-таки лучше.
к плагину еще бы ссылочку…
нашел только эту, а в новой библиотеке UI jQuery 1.5 такого вроде бы и нет… странно – вещь то полезная!
да и вообще, если можно побольше сылок
просто действительно трудно найти – где там на сайте разработчиков весь список опций…
Страница плагина на сайте разработчиков jQuery – http://docs.jquery.com/Plugins/Tablesorter
Сайт плагина – http://tablesorter.com/docs/
Естественно все на английском языке.
А есть скрипт с фильтром, который позволяет вписывать часть слова для поиска в ячейках ?
Да. Это jqGrid. Вы найдете интересующую Вас возможность например на вкладке Advanced -> Search Big Sets.
Подскажите как разделять большие числа в ячейках. Например не «1000000″ а «1 000 000″, а то если самому пробелы втыкать, то неверно сортируется. И ещё неверно сортирует малые значения как 0,12, 0,7, 0,1
Значения от 0 до 1 плагин сортирует верно и без всяких проблем. Если не верите на слово – могу показать на примере. Что касается «больших» чисел, то если «втыкать» пробел, то вполне естественно, что сортировка не будет верно работать. Как отделять группы нулей друг от друга? Не знаю, никогда не задумывался. Может кто-то подскажет интересный вариант?
Gennady.
У меня почему-то не правильно сортируется колонка «Площадь» на сайта http://www.landvolga.ru Малые величины вперемешку. Что я не правильно делаю?
Попробуйте эти цифры выводить в едином формате. Т.е. если у Вас встречается значение 0,27, то и значение например 2540 выводить в таблицу как 2540,00
Спасибо помогло.
А, нет, не помогло. Теперь большие числа неверно сортируются
а если таблица генерится на php,содержит в себе теги, кнопки и всякую там лабудень,тогда сортировка будет работать??
Никакой принципиальной разницы между таблицей, написанной «руками» и сгенерированной на сервере нет. Просто есть требования этого плагина к структуре таблицы – если они соблюдены, тогда и сортировка будет работать. То есть сортировка по столбцам таблицы, где есть числовые, строковые значение, даты например. Если пытаться отсортировать по столбцам с кнопками например – то тогда и результат никто не гарантирует.
А можно как-нибудь добавить к таблице постраничную навигацию?
Можно. Попробуйте jQuery DataTables.
Средством JavaScript изменяю в ячейке данные…
Сортировка происходит так как было при загрузке страницы,то есть если вместо 10 я пишу 200 сортировка просиходит так как-будто там значение 10 а не 200. Думаю что проблема вся в обновлении данных…Вопрос: Как обновить массив с данными,чтоб можно было производить сортировку?
Все-таки этот плагин достаточно прост. Если Вы хотите реализовать свои задумки, Вам надо не его использовать, а писать что-то свое. А jQuery в этом поможет. Может быть стоит посмотреть в сторону UI/Sortable
УРА!!!!Решилась проблема!!!!!!!
http://tablesorter.com/docs/example-ajax.html
Достаточно было ввести после изменения записи строку:
$(«table»).trigger(«update»);
Сильно!
Значит мой коммент ф топку. Надо чаще в доки заглядывать.
большое спасибо Вам за статью, она мне очень помогла.
но у меня остался один вопрос: имеется одна страница с таблицей, которая обновляется каждую минуту (обновляется с META Refresh). как можно сохранить сортировку этой атблицы после перезагрузки страницы?
заранее спасибо
Оф.сайт плагина http://tablesorter.com/docs/
посмотрите внизу, в разделе Download есть Cookie Widget. Попробуйте…
Есть аналог этой либы.
Идёт отдельно. В ней чуток другой принцип постраничной реализации(форумный)
Тоже вполне хорошая вещь.
Ссылку не кинул =)
http://www.frequency-decoder.com/2006/09/16/unobtrusive-table-sort-script-revisited
Большое спасибо автору (Gennady) за статью давно искал нечто подобное – до этого все реализовывал с помощью php + css и частые перезагрузки таблицы весьма утомляли.
Единственное, наверное хотелось бы все же прочесть полную русифицированную документацию к плагину со всеми его свойствами и возможностями. Искренне надеюсь что статья будет добавлена.
Столкнулся со следующей проблемой:
Если внутри таблицы есть элементы, к которым нужно прописывать события (в моем случае click(), что там с другими не проверял), то после применения к таблице tablesorter() остальные события по всем элементам не проходят.
Дальше интереснее. Если применить tablesorter() выше объявлений событий, то они работать будут ровно до первого вызова сортировки.
Отпишитесь, если кто в курсе.
Ща буду рыть, если найду в чем дело – расскажу.
Чтобы понять причину этого, почитайте Обработка событий для элементов DOM, загружаемых через ajax.
А решение Вам выбирать в зависимости от того, какую версию библиотеки используете. Если 1.2, то это Live Query или что-то подобное. Если версия 1.3+, то там уже встроенный метод live() есть.
Спасибо! Очень помогли!
Встроенные метод live() не биндит события focus и blur, или мне кажется?
Не кажется. live() работает с click, dblclick, mousedown, mouseup, mousemove, mouseover, mouseout, keydown, keypress, keyup и не работает с blur, focus, mouseenter, mouseleave, change, submit.
Добрый день.
Наблюдаю следующий глюк.
Если в хотя бы в одной из ячеек столбца есть строка начинающаяся с русской «в», то сортировка по этому столбцу не работает.
Логику понять не смог.
Юрий, не знаю на счет буквы «в», но у меня была аналогичная проблема с сортировкой, где находилась строка, начинающаяся на точку(«.»)…Оказалось, что он выбирает неправильный тип данных для сортировки…Проблема решается добавлением
headers: {
«здесь номер столбца»: {
sorter:’text’
}
в инициализацию tablesorter.
Алексей, спасибо большое, помогло.
Как раз искал, как это делать.
Включил debug mode, и он мне показал, что тип столбца определился как «валюта». Сейчас исправил на «текст» и все заработало.
Подскажите, пожалуйста, как сделать для разных столбцов разный textExtraction…
ИМХО плагин плохой, аргументирую!!!
Кода лишнего… не известно что там можна написать на 800 строк.
Очень большой минус:
1. Сортировка происходит с использованием метода
«eval» (генерируется ф-ция сортировки) и каждий
раз заново даже когда используется мульти
сортировка заново сортируется полностью вся
таблица.
2. Html код меняется даже в том случае когда данные
не могут быть отсортированы (это можна
посмотреть в плагине FireFox – FireBug), что
абсолютно безсмисленно.
Дальше даже не смотрел, потому что ИМХО хавать пирожок и не знать какая начинка… думаю сами понимаете
добавляю
headers: { номер столбца: { sorter: false} }
и сортировка вообще перестает работать..
как заблокировать сортировку по определенному столбцу ?
$("#example").tablesorter({ sortList:[[1,0]], widgets: ['zebra'], headers: { 3: { sorter: false} } });прекрасно работает… Может запятую где забыли?
да, так оно и было
спасибо!
Всем привет.
Можно ли для столбца задать свое правило сортировки?
Всем спасибо. Решение найдено
http://tablesorter.com/docs/example-parsers.html
такой глюк- при скачивании примера не работает сортировка по первому столбцу.
понял в чём дело, большое спасибо у меня подключена prototype. Заменил $ на jQuery – всё заработало.
У меня какая-то странная трабла.
Пытаюсь сортировать таблицу по полю, в котором просто выводятся цифры – количество просмотров.
например у меня вот такая таблица
2
5
6
18
10
20
при сортировке (по убыванию) по этому столбцу получается вот так:
6
5
20
2
18
10
т.е. сортирует по первой цифре, а не по всему числу.
как решить эту проблему?
Заранее спасибо за ответ.
Т.е. сортирует этот столбец как будто там строка, а надо что бы оно понимало, что там цифры…
Дмитрий,
комены выше №№ 34-35-36
))
великолепно! читал все каменты, но самые главный как-то пропустил …. спасибо!
Огромное спасибо за статью, пригодилась
Геннадий здравствуйте, подскажите пожалуйста такую вещь. В документации везде приводятся примеры где к шапке таблицы аякс-запросом добавлеяется html -тело таблицы и потом все работает. У меня же вся таблица -html-код(вместе с шапкой) возвращается в резултьтате аякс запроса (всю таблицу формирует php скрипт) Как бы понятнто что таблица вернулась и все должно работать ведь шапка в коде есть,но сортировки нет. Хотя в этой же папке создал html файл перебросил код из примера и все работает. То есть не работает при аякс запросе. Как можно решить проблему? Я думал виджет сам понимает что данные пришли (типа метод live встроенный есть) Делал и так $(«#myTable»).trigger(«update»); Но это же для примера когда шапка есть а добавятеся тело и у меня ничего не работает. Как правильно повесить триггер в моем случае?
Как правильно повесить триггер в моем случае?
Собственно никак. Функциональность плагина связывается с таблицей (частный случай – пустая таблица, где есть только шапка) и именно с таблицей. У Вас же в момент инициализации плагина, таблицы как таковой не существует.
В общем разве что грузить обработчик (плагин tablesorter) вместе с таблицей. Тогда должно все работать.
В общем разве что грузить обработчик (плагин tablesorter) вместе с таблицей. Тогда должно все работать.
Геннадий, извините не совсем понял
Вы это имели в виду? У меня по пути file2 находится скрипт формирующий таблицу
$.ajax({ url: file2,
cache: false,
dataType:»html»,
success: function(html){
$(«#pageContent»).html(html); сюда таблица вставл
$(«#myTable»).tablesorter(); а здесь получается обрабочик???
}
});
Не фурычит (:
Т.е. html-разметка «рисуется» в file2? Ну так и вставьте туда же JS-код, который инициализирует плагин tablesorter… Должно сработать. Не здорово конечно это, но все же.
Спасибо большое Геннадий Вы абсолютно правы. Так оно работает. Попробовал в скрипте file 2 поставить над своей таблицей пробную таблицу, что шла с плагином как демо для нее все работает. Я не подумал и забыл сказать что у меня на ячейки таблицы подписан плагин ContextMenu (хотя на шапку не подписан) возможно он глушит функционал этого плагина? А вообще если плагины обслуживаю один Dom елемент они глушат друг друга?
Есть более подробное описание плагина на русском языке – http://w3pro.ru/article/plagin-jquery-dlya-sortirovki-html-tablits
Рекламируетесь?
На самом деле материалы у Вас действительно качественные.
P.S. Ссылку я поправил, а лишний коммент удалил…
день добрый. спасибо за статью. у меня проблема с сортировкой цен в таблице. сортирует только по первому числу. дебаг показывает, что столбец обрабатывается как текст. подскажите как сделать, чтобы столбец обрабатывался как число
См. комментарии 34-36.
headers: { “здесь номер столбца”: { sorter:’text’ }я так понимаю мне нужно text заменить на integer или numeric? так пробовал. но не получается. дебаг все равно пишет что столбец воспринимается как текст..=(
Столбцы нумеруются, начиная с нуля, т.е. первый столбец – 0, второй – 1 и т.д. У Вас так?
Если в этом ошибки нет, то возможно спасет добавление собственного парсера:
http://tablesorter.com/docs/example-parsers.html
да, столбцы начинаю с нуля. парсер решил мою проблему. спасибо большое за помощь=)
а как отключить плагин данный?
например sortable легко отключается destroy-ем, а тут что то найти не могу….
Добрый день!
Подскажите пожалуйся, как сделать что бы при первом клике на колонку вывод был в обратном порядке(Я-А)?
Заранее спасибо!
Попробуйте при инициализации задать порядок сортировки в требуемой колонке отличным от того, что требуется при первом клике. Вот например так:
т.е. при инициализации вторая колонка будет отсортирована по возрастанию. Первый клик – и она отсортирована по убыванию…
Обсуждение закрыто. В дальнейшем вопросы можно задавать на форуме jQuery.