
Многие наверняка знакомы с плагином quicksearch для jQuery. Этот плагин, перебирая заранее подготовленный список всех элементов и их текстовое представление, проверяет наличие ключевых слов с использованием функции indexOf.
Мне такое решение не понравилось. Я считаю, что этот функционал должен быть нативным.
Похоже, для этого был предназначен псевдокласс :contains(), но НЛО прилетело и опубликовало в стандарте следующее:
6.6.6. Blank
This section intentionally left blank. (This section previously defined a :contains() pseudo-class.)
Я нашел альтернативу: селектор атрибутов [att*=val]. Он позволяет делать выборку элементов с атрибутом содержащим подстроку (что, по сути, является аналогом indexOf). Таким образом динамически добавляя и удаляя стили мы можем сделать поиск практически полностью на CSS и только управляющая логика будет на javascript. Для этого нам нужно заранее создать атрибуты содержащие текстовое представление элементов. Это можно сделать еще на сервере, а можно при помощи javascript на клиенте.
Пример реализации данного метода
if (!document.head) document.head = document.getElementsByTagName('head')[0]; var css = document.createElement("style"); document.head.appendChild(css); function search() { var selector = ''; var searchBox = document.getElementById('searchBox'); var keywords = searchBox.value.toLowerCase().split(' ').filter(Boolean); for (var i = 0; i < keywords.length; i++) selector += (i ? ',' : '') + 'div:not([index*="' + keywords[i] + '"])'; if (selector) css.innerHTML = selector + '{display: none;}'; else css.innerHTML = ""; } $(document).ready(function() { $('div').each(function(key, value) { $(value).attr('index', $(this).text().toLowerCase()); }); $("#searchBox").keyup(search); });
Live demo
Этот селектор поддерживается во всех современных браузерах (Firefox 3+, Opera 9.5+, IE 7+).
WebKit браузеры тоже поддерживают данный селектор, но из-за проблем с производительностью на операциях с добавлением и удалением стилей, использовать данную технику будет сложно.
[07.06.2012] Update:
Нашел немного времени и провел ревизию своих старых проектов.
Обновил Live demo. Теперь там сравнение поиска на CSS3 и JavaScript(QuickSearch).
Спасибо ivan386 за очень полезный комментарий, благодаря ему возможно правильно замерять скорость.
Back to back comparison
PS: Судя по всему оба варианта работают приблизительно одинаково по скорости, чего и стояло ожидать.