Практика

JavaScript

и PHP

Что лучше: посылать к базе данных запрос «вслепую», или фильтровать видимые данные прямо на HTML-странице (как на листе Excel)? При наличии инструмента «визуальной» фильтрации HTML, можно найти «золотую середину»

учебник HTML скачать
(вся книга в одном файле 3.92М)

Статьи

Добавить статью:

*Заголовок:
Имя файла (только латинские буквы):
Автор:
*Текст:

Правила оформления:

  • HTML-тэги не работают (выводятся на экран в виде кода)
  • Абзац - два раза Enter (абзацы отделяются пустыми строками)
  • __курсив для группы__, **жирный для группы** (2 знака подчёркивания или 2 звёздочки перед первым словом группы и после последнего);

~~~~~~~~~~~~~~~~~~~~


ir2.ru

ООО РИА «Лимон и К»
2006-2012

Иркутск-81, Депутатская, 79-27. Тел.: +7 3952 230413

~~~~~~~~~~~~~~~~~~~~

Javascript фильтрация данных

Сортировать HTML-таблицу мы уже научились. Вторая после сортировки задача базы данных – выборка строк из таблицы по определённому критерию. Например, чтобы поле город заканчивалось на -тск. Эту вторую задачу разумнее, конечно, решать на сервере: сначала выбрать данные, а потом вывести их на HTML-страницу. А не наоборот – выложить всю таблицу из БД пользователю, а он потом пусть как хочет сортирует и фильтрует этот многомегабайтный файл.

Проблема в том, что пользователь не всегда точно знает, что ищет (как наилучшим образом сформулировать запрос для БД). Например, вы хотите найти «выпадающее меню» в Яндексе. Ну, нашли сколько-то тысяч миллионов. Полистали ссылки, оказалось, что надо всё-таки «многоуровневое меню». А потом ещё одно уточнение: «выезжающее» (а не «выпадающее»). Увидели, что с этим связано слово «слайд» (или slide) – и опять новый запрос, в котором половина первоначальных данных по меню теряется... Всё это вы ищете приблизительно на первых десяти страницах. И можно не набирать каждый раз новый запрос для поиска, а вывести, например, первых 100 результатов (или хотя бы 50) по «приблизительному» запросу, а потом дополнительные слова искать в браузере обыкновенным Ctrl+f. При поиске с помощью Ctrl+f современные версии браузеров обычно подсвечивают все найденные результаты на странице.

Если данные выводятся в HTML в виде таблицы, можно эту таблицу скопировать в Excel и там сортировать и фильтровать, гибко отбирать нужные данные. Всё дело в этом – в гибкости визуальных (как в Excel) табличных фильтров. При запросе к серверной БД вы заранее не видите, из чего выбирать, и невольно возникает скрытое пожелание: «Огласите весь список!». У кого-то, конечно, возникает, а у кого-то и нет. Узнать мы об этом наверняка не можем, потому что для визуальных фильтров, для отбора данных прямо на HTML-странице просто не существует широко используемых инструментов. У себя на сайтах мы начинаем понемногу такие инструменты внедрять.

Пример – список рубрик для доски объявлений http://irkutsk.ir2.ru/. В правом фрейме мы выводим весь список рубрик (что-то вроде таблицы из одной колонки), а над списком – поле ввода для поиска. При вводе букв в поле поиска список немедленно изменяется:

Это лучше, чем подсвечивание браузера по Ctrl+f; потому что при подсвечивании все ненужные строки остаются на странице, и среди них бывает довольно сложно найти высвеченное слово. Применение фильтра же предполагает, что на странице остаются только строки с искомым значением.

Следующий шаг – создание фильтра для таблицы из нескольких колонок. Фильтры обычно используют вместе с сортировкой, поэтому Javascript функцию фильтрации строк мы не стали помещать в отдельный проект, а просто добавили к скрипту Simple Table Sorter и присвоили ему номер версии 2.0 (файл http://ir2.ru/tabsort2.js); примеры работы: http://ir2.ru/tabsort3.htm, http://ir2.ru/limit1000.htm (260 Кб, 1000 строк – для оценки производительности).

Подключение

Функция фильтрации подключается к скрипту-сортировщику так.

1. Во-первых, надо подключить сам скрипт сортировки, для этого в элемент head страницы нужно поместить три следующие строчки:

(ну, и, соответственно, поместить на сайт три файла: http://ir2.ru/ir2.js, http://ir2.ru/tabsort2.js, http://ir2.ru/tabsort.css). Для того, чтобы таблица обрабатывалась сортировщиком (и функцией фильтрации), в HTML-коде таблицы следует указать <table class="sortable">

2. Сам модуль фильтров по значениям колонок таблицы можно подключить двумя способами: только к заголовкам с явно указанным типом сортировки (<th axis="num">, <th axis="str">) или ко всем заголовкам подряд.

Для подключения фильтров к заголовкам с явно указанным типом сортировки нужно в секции скрипта tabsort2.js "Настройки" назначить use_inputs = true.

Для подключения модуля фильтров ко всем заголовкам сортируемых таблиц без разбора в секции "Настройки" назначить use_inputs = true; inputs_force = true.

Особенности работы

Подключенный модуль фильтров во время подготовки таблиц к сортировке (функция preptabs()) добавляет к каждому (если inputs_force = true) полю заголовка таблицы элементы input: если тип сортировки задан явно и равен "num" (<th axis="num">), добавляется два поля ввода input с подсказками впереди (>= и <=); если ввести число в верхнее поле ввода (>=), будет производиться отбор строк, данный столбец которых содержит числа большие или равные введённому пользователем значению; елси ввести число в нижнее поле – наоборот; таким образом, можно отфильтровать диапазон чисел по данному столбцу.

Во всех остальных случаях (<th axis="str">, другие значения, не равные "num" или вообще отсутствие axis) функция preptabs() добавляет к полю заголовка один элемент input; при вводе в него символов производится поиск значений по данному столбцу – ищутся совпадения с введённой пользователем строкой от начала строк; если первым символом в поле поиска пользователь введёт пробел, будут искаться совпадения в любой части строки (не только от начала).

Количество найденных строк отображается в отдельном элементе span с красной рамкой, который позиционируется на 100 пикселов выше поля поиска. Оформление этого элемента можно изменить в правилах CSS для класса .abstopleft в файле tabsort.css. Для удаления сообщения с количеством результатов следует нажать Escape. При последующих отборах строк с помощью полей поиска сообщение будет появляться заново.

Производительность

Скорость фильтрации строк (как и сортировки) с помощью наших Javascript функций невелика. Её, разумеется, нельзя сравнивать со скоростью фильтрации на стороне сервера. Так, в нашем примере из 1000 строк (файл http://ir2.ru/limit1000.htm, 260 Кб) отбор после введённого значения для поиска длится 3-4 секунды (AMD Athlon 999МГц, 512 МБ ОЗУ, Windows XP, Firefox 3). В Гугл Хроме, разумеется, в полтора-два раза быстрее. Ну, и скорость работы нашего Simple Table Sorter'а в любом случае выше скорости работы всех известных нам аналогов типа сортировщика для jQuery: наши алгоритмы - и сортировки, и фильтрации данных - ориентированы прежде всего именно на скорость работы (за счёт чего, конечно, в какой-то степени пострадал интерфейс).

Функция фильтрации строк, работающая на этой странице:

D.M., admin

157. тест

Во-от. Сказано же в форме добавления статей: в имени файла только латинские буквы! А я решил выпендриться, добавил подчёркивания (js_data_filter), думал, это просто так про только латинские буквы написано. Вот комментарии и перестали добавляться. Теперь исправлено.

26.08.2010 04:45:05

158. D.M., admin

Готов скрипт сортировки и фильтрации данных, версия 2.1: tabsort2.1.js. Изменение в способе подключения:

  1. Не нужна библиотека ir2.js (все необходимые функции есть внутри самого скрипта).
  2. Вместе со скриптом tabsort2.1.js необходимо подключать к HTML-странице файл стилей tabsort.css (так как CSS-правил стало слишком много).

Пример работы: limit202.htm

26.08.2010 04:47:46

175. D.M., admin

Система отбора и сортировки данных пополнилась разбиением таблицы на страницы (paginate) и стала такой сложной, что пришлось собрать все необходимые для работы файлы в архив BigTableSorter.zip.

Примеры работы: test-tracker/limit1003.htm – таблица в 1000 строк; test-tracker/tracker2.php.htm – таблица в 500 строк (из-за объёма работает медленнее, чем в 1000 строк); test-tracker/tracker.php.htm – на движке jquery.tablesorter.js (для сравнения с нашим);

test-tracker/limit3000.htm – таблица в 3000 строк.

24.10.2010 10:43:43

189. Player0

Здравствуйте. Пользуюсь вашим скриптом. Версия старенькая (1.2 http://front-mission.org/skripts/tabsort.js), но зато меня в ней всё устраивало. Сменил тут DOCTYPE на XHTML 1.0 Transitional и скрипт стал некорректно работать – а именно, перестала работать "зебра" в файрфоксе и хроме. При первой же сортировке всё смешивается. В опере работает нормально :) Попробовал самую новую версию – там тоже самое. В чём может быть дело?

17.01.2011 23:42:01

191. D.M., admin

Здравствуйте, Player0! Не, к старой версии я уже возвращаться не могу. Сейчас скрипт существует в двух видах:

1) маленький (без зебры) – http://ir2.ru/sorters/SimpleTableSorter.zip;

2) для больших таблиц (зебра есть) – http://ir2.ru/sorters/BigTableSorter1.zip. Пример в работе: http://irk09.ru/ (только там очень внимательно подключать надо – по инструкции на стр. http://ir2.ru/tabsort1.aspx – раздел «Дистрибутив и использование»).

Вот по этим версиям приму любые замечания и всё постараюсь исправить (или дополнить).

20.01.2011 05:34:28

193. player0

Эх жаль, что в новой зебры нет. А с большой версией связываться не хочу. PS: комментарии тут добавляются через раз :(

20.01.2011 20:11:38

205. Da Boogie Woogie

а вот такая зебра: tr:nth-child(2n+1) { background:#ddd; } не подходит?

24.02.2011 12:12:42

208. D.M., admin

Da Boogie Woogie, подходит. Но проблема в том, что и "такая" и "сякая" зебры очень хорошо и безусловно подходят ко всем браузерам, кроме ИЕ. В ИЕ я перепробовал, кажется, все способы зебр, и каждая из них при некоторых условиях работы начинает сильно тормозить. Я давно исключил из своих скриптов все эти критичные условия, но "осадок остался"...

27.02.2011 11:20:25

256. Alexey

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

02.10.2011 01:40:01

257. D.M., admin

Alexey,

это сделать возможно, и я даже знаю примерно, как. Но не быстро. Надо несколько дней. Как сделаю, напишу.

03.10.2011 15:32:49

260. D.M., admin

Добавлено поле "Общий поиск:" над таблицей; при вводе букв в это поле производится поиск значений по всем столбцам. Пример: http://ir2.ru/sort1/table1000.htm (это скрипт Big Table Sorter v 1.01 )

08.10.2011 17:27:04

273. asmman

А можно в поиске по части значения избавиться от необходимости ставить пробел перед фразой? А то пользователям разяснения необходимо писать а они их вряд ли читать будут.

17.11.2011 10:11:43

274. D.M., admin

asmman,

можно. Сам уже отказался на рабочих сайтах от идеи ставить впереди пробелы. Только скажите, в каком скрипте это сделать (а то версий много, я уже сам в них запутался). Напишите здесь ссылку на дистрибутив или вышлите файл js на адрес stopkran@inbox.ru, я исправлю.

17.11.2011 18:46:37

Добавить комментарий:

*Автор:
E-Mail:
*Текст: