Практика JavaScript и PHP | Что лучше: посылать к базе данных запрос «вслепую», или фильтровать видимые данные прямо на HTML-странице (как на листе Excel)? При наличии инструмента «визуальной» фильтрации HTML, можно найти «золотую середину» |
учебник HTML скачать
| Javascript фильтрация данныхСортировать HTML-таблицу мы уже научились. Вторая после сортировки задача базы данных – выборка строк из таблицы по определённому критерию. Например, чтобы поле город заканчивалось на -тск. Эту вторую задачу разумнее, конечно, решать на сервере: сначала выбрать данные, а потом вывести их на HTML-страницу. А не наоборот – выложить всю таблицу из БД пользователю, а он потом пусть как хочет сортирует и фильтрует этот многомегабайтный файл. Проблема в том, что пользователь не всегда точно знает, что ищет (как наилучшим образом сформулировать запрос для БД). Например, вы хотите найти «выпадающее меню» в Яндексе. Ну, нашли сколько-то тысяч миллионов. Полистали ссылки, оказалось, что надо всё-таки «многоуровневое меню». А потом ещё одно уточнение: «выезжающее» (а не «выпадающее»). Увидели, что с этим связано слово «слайд» (или slide) – и опять новый запрос, в котором половина первоначальных данных по меню теряется... Всё это вы ищете приблизительно на первых десяти страницах. И можно не набирать каждый раз новый запрос для поиска, а вывести, например, первых 100 результатов (или хотя бы 50) по «приблизительному» запросу, а потом дополнительные слова искать в браузере обыкновенным Ctrl+f. При поиске с помощью Ctrl+f современные версии браузеров обычно подсвечивают все найденные результаты на странице. Если данные выводятся в HTML в виде таблицы, можно эту таблицу скопировать в Excel и там сортировать и фильтровать, гибко отбирать нужные данные. Всё дело в этом – в гибкости визуальных (как в Excel) табличных фильтров. При запросе к серверной БД вы заранее не видите, из чего выбирать, и невольно возникает скрытое пожелание: «Огласите весь список!». У кого-то, конечно, возникает, а у кого-то и нет. Узнать мы об этом наверняка не можем, потому что для визуальных фильтров, для отбора данных прямо на HTML-странице просто не существует широко используемых инструментов. У себя на сайтах мы начинаем понемногу такие инструменты внедрять. Пример – список рубрик для доски объявлений http://irkutsk.ir2.ru/. В правом фрейме мы выводим весь список рубрик (что-то вроде таблицы из одной колонки), а над списком – поле ввода для поиска. При вводе букв в поле поиска список немедленно изменяется: Отбор по буквам:
0 (пробел впереди - искать в середине строки) Автокредит (1) Автосервис (8) Автошины (2) Банки (1) Безопасность (6) Безопасность - системы (3) Бетон (5) Это лучше, чем подсвечивание браузера по 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. Изменение в способе подключения:
Пример работы: 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 Добавить комментарий: |