Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #11 (permalink)  
Старый 02.04.2013, 08:41
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,588

You are doing it wrong.
Нормальные люди делают это через Selection/Range.
__________________
29375, 35
Ответить с цитированием
  #12 (permalink)  
Старый 03.04.2013, 01:06
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

Пытался я мудрить с innerText + Range. Ничего не получилось. Не нашел я возможности задать выделение используя позиции символов (setStart, setEnd принимают индексы дочерних узлов, а не символов). Не говоря уже о Firefox..
Aetae, если можно - вкратце алгоритм. Или ссылочку.
Ответить с цитированием
  #13 (permalink)  
Старый 11.04.2013, 23:59
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,588

Всё проще: стандартный 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 почём зря), но суть отражает.
__________________
29375, 35

Последний раз редактировалось Aetae, 12.04.2013 в 00:31.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Checkstyle для JavaScript Alex.Kolonitsky Библиотеки/Тулкиты/Фреймворки 8 10.12.2009 12:52
нужна программа для этого. Чем писать? javascript или php? spam-server Серверные языки и технологии 3 27.08.2009 00:52
Загрузить title для ссылок на странице MarikVal jQuery 0 27.07.2009 20:38
Регулярное выражение для поиска смайлов. NightmareZ Общие вопросы Javascript 13 23.06.2009 13:12
Форма поиска Владимир Новицкий Элементы интерфейса 4 21.01.2009 02:32