Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Форма для поиска по странице средсвами javascript (https://javascript.ru/forum/misc/7017-forma-dlya-poiska-po-stranice-sredsvami-javascript.html)

Aetae 02.04.2013 08:41

You are doing it wrong.
Нормальные люди делают это через Selection/Range.

danik.js 03.04.2013 01:06

Пытался я мудрить с innerText + Range. Ничего не получилось. Не нашел я возможности задать выделение используя позиции символов (setStart, setEnd принимают индексы дочерних узлов, а не символов). Не говоря уже о Firefox..
Aetae, если можно - вкратце алгоритм. Или ссылочку.

Aetae 11.04.2013 23:59

Всё проще: стандартный window.find в связке с getSelection, пусть браузер всё делает за нас. =)
Примерно так:
<!DOCTYPE html>
<html lang="ru-RU">
<head>
    <meta charset="UTF-8">
    <script type="text/javascript">
    superfind = function(){
        var surround = document.createElement('span');
        surround.style.background='#f00';

        return function( str ){
            var sel = getSelection();        // получаем выделение
            sel.removeAllRanges();           // обнуляем его


            if(surround.hasChildNodes()){ //если ужк есть выделение
                sel.collapse(surround.nextSibling,0); // ставим в позицию конца предыдущего поиска, если есть(^_^ для новых поисков обнуление не предусмотрено)

                var temp = document.createDocumentFragment();
                while(surround.hasChildNodes()) temp.appendChild(surround.firstChild);
                surround.parentNode.replaceChild( temp,surround); //возвращаем как было(^_^ тут может быть баг при нахожении одного в другом)
            }

            while(sel.isCollapsed){ //ищем пока что-нить не найдёт в документе(а не в input)
                if(!find( str )){   //и пока документ не закончится
                      return false
                }
            }
            var range  = sel.getRangeAt(0); //получаем range
            range.surroundContents(surround); //оборачиваем найденное
            sel.collapse(surround,1);  //схлопываем выделение

            return true
        }
    }();
    </script>
</head>
<body>

<p>
    Шизофрени́я (от др.-греч. σχίζω — раскалываю и φρήν — ум, рассудок), ранее лат. Dementia praecox («преждевременное слабоумие») — полиморфное психическое расстройство или группа психических расстройств, связанное с распадом процессов мышления и эмоциональных реакций. Шизофренические расстройства в целом отличаются характерными фундаментальными расстройствами мышления и восприятия, а также неадекватным или сниженным аффектом. Наиболее частыми проявлениями болезни являются слуховые галлюцинации, параноидный или фантастический бред либо дезорганизованность речи и мышления на фоне значительной социальной дисфункции, нарушении работоспособности.

    Многообразие симптоматики породило дебаты о том, является ли шизофрения единым заболеванием или представляет собой диагноз, за которым кроется ряд отдельных синдромов. Эта неоднозначность была отражена при выборе названия: Блейлер использовал множественное число, именуя болезнь шизофрениями.
</p>
<input type="button" value="Найти" onclick="superfind(nextSibling.value)"/><input type="text" value="шизо"/>
</body>
</html>

Набросал на скорую руку, потому подводные камни ещё есть(surroundContents я бы вообще не использовал, имхо не стоит трогать dom почём зря), но суть отражает.


Часовой пояс GMT +3, время: 11:09.