Ну, на самом деле я построил это сам.
Существующие решения (которые я мог найти) были неубедительными.
Я хотел иметь возможность искать очень длинное дерево (ul / li / ul ...), которое отображается как одна страница; содержит более 5000 предметов.
Звучит немного странно, если такое длинное дерево отображать на одной странице, но на самом деле при свертывании / развертывании это гораздо более интуитивно понятно, чем на отдельных страницах, и, поскольку мы в автономном режиме, время загрузки не является проблемой (время разбора хотя, но Chrome потрясающий; -)
Функция поиска, предоставляемая современными браузерами (в любом случае FF и Chrome), имеет две большие проблемы: они ищут только видимые элементы на странице и не могут искать непоследовательные слова.
Я хочу иметь возможность искать свернутые элементы (не видны на экране); Я хочу найти «один два три» при поиске «один три» (как в Google / Lucene); и я хочу открыть только ветви дерева, содержащие найденные предметы.
Итак, что я сделал:
- создать инвертированный индекс слов <-> идентификаторы предметов из списка (через xslt) (около 4500 уникальных слов в документе)
- преобразовать этот индекс в группу массивов javascript (одно слово = один массив, содержащий идентификаторы)
- при поиске пересекаются массивы, представленные поисковыми словами
- шаг 3 возвращает массив идентификаторов, которые я могу затем открыть / выделить
Он делает именно то, что мне нужно, и это действительно быстро. Более того, поскольку он выполняет поиск по независимому «индексу» (массивам идентификаторов), он может выполнять поиск, когда список даже не загружается в браузер!