sorttable. JavaScript - сортировка таблиц
Февраль 23, 2006
Все мы постоянно встречаемся с табличными данными. Зачастую таблицы состоят из десятков строк, и работать с ними намного удобнее, отсортировав данные. В то же время, большинство из тех сортировок таблиц что мне приходилось видеть сводилась к следующему: после клика по заголовку столбца на сервер посылается запрос с кодом этого заголовка, далее скрипт, выводящий таблицу выбирал данные из БД ORDER BY соответственное поле (например http://forum.ixbt.com/?id=36&sort=topic). Далее все это передавалось пользователю. Цель этой заметки – рассказать о другом методе сортировки таблиц, который базируется на DOM.
Конечно же я не стану брать на себя авторство всего этого метода. Впервые я нашел чтото подобное на сайте kryogenix. Их версия в отличии от некоторых аналогов (довольно неплохих), позволяет максимально безболезненно и просто добавлять сортировку к существующим таблицам, не вставляя ненужные куски ДжаваСкриптов в текст странички. Почему это хорошо, читаем тут.
Использование. Берем скрипт и подключаем его в в head’е страницы:
<script src="sorttable.js"></script>
Далее, для всех таблиц, которые будут сортироваться, ставим класс sortable, и какие id (id должны быть уникальны)
<table class="sortable" id="unique_id">
После этих нехитрых манипуляций все должно работать.
Насколько я понял, лицензия разрешает делать с данным кодом практически что угодно. Этим и займемся.
Например, если сделать таблицу полосатой таким образом (makeStripe), то после сортировки вполне возможно, что полоски перестанут чередоваться. А исправить эту досадную фичу очень просто: в функции sortables_init добавляем makeStripe (это будет первичная раскраска):
function sortables_init()
{
...
for (ti=0; ti<tbls.length; ti++)
{
thisTbl = tbls[ti];
if (...)
{
ts_makeSortable(thisTbl);
makeStripe(thisTbl);
}
}
}
Далее, следует перекрашивать таблицу после каждой сортировки. Для этого в функции ts_resortTable в самом конце вызываем makeStripe:
function ts_resortTable(lnk)
{
...
makeStripe(table);
}
Теперь допустим, что нам нужно, чтобы не все столбцы были сортируемые. Я предлагаю в таком случае для этих столбцов присвоить класс unsort, и внести изменения в функцию ts_makeSortable:
function ts_makeSortable(table)
{
...
for (var i=0; i<firstRow.cells.length; i++)
{
var cell = firstRow.cells[i];
if(cell.className.indexOf("unsort")==-1)
{
var txt = ts_getInnerText(cell);
...
}
}
}
Внимательно посмотрев на скрипт, мы видим, что лвиную долю кода занимают различного рода сортировки: ts_sort_date – для дат, ts_sort_currency – для валюты и т п. Исходя из наших возможностей, мы можем добавлять новые виды сортировок, а исходя из наших желаний удалять существующие. При этом нужно редактировать код функции ts_resortTable. Ясно, что сортировки задаются при помощи сравнений, и если можно чтото сравнивать, значит можно и сортировать. В оригинальной версии еще немного неаккуратно сделана стрелочка, обозначающая направление сортировки, я предпочитаю вообще без нее.
Ну и наконец, о недостатках: из отмеченных мной стоит отметить медлительность при сортировку таблиц з количеством строк, сильно превышающим 100, и непрвильная сортировка слов с некоторыми символами, которые расположены в таблице символов не по алфавиту.
Ноябрь 19th, 2006 в 8:31 pm
[…] Сортировка таблицы. […]
Май 25th, 2007 в 1:17 pm
Реально ли так сортировать/перекрашивать если в таблицу вложены другие таблицы? Т.е. всё, что глубже первого уровня не обрабатывается отдельно
Май 25th, 2007 в 2:11 pm
2Guest007: думаю нужно будет немного поредактировать скрипт чтобы это сделать.
Кстати, недавно вышла новая версия sorttable.
Июнь 18th, 2007 в 8:47 pm
А можно что бы сортировался нужный столбец при загрузке?
С уважением, Владислав.
Июнь 18th, 2007 в 10:42 pm
2Владислав - а почему нет? Просто вызывать сортировку (такую как вызывается по onclick по заголовку) по onload.
Ноябрь 17th, 2007 в 3:48 pm
>>А можно что бы сортировался нужный столбец при загрузке?
авторы говорят нельзя:
Lots of people ask, “how do I make sorttable sort the table the first time the page is loaded?” The answer is: you don’t. Sorttable is about changing the HTML that is served from your server without a page refresh. When the page is first served from the server, you have to incur the wait for it to be served anyway. So, if you want the table sorted when a page is first displayed, serve the table in sorted order. Tables often come out of a database; get the data from the database in a sorted order with an ORDER BY clause in your SQL. Any solution which involves you running sorttable as soon as the page loads (i.e., without user input) is a wrong solution.
>>Просто вызывать сортировку (такую как вызывается по onclick по заголовку) по onload.
во второй версии скрипта нет события onclick