Форма для поиска по странице средсвами javascript
Очень нужен код, который бы отображал на страничке поле ввода и кнопку "Найти".
Нужно чтобы после ввода строки в поле ввода и нажатия на кнопку "Найти" осуществлялся поиск по текущей странице. Найденная строка должна подсвечиваться цветом. В общем замена стандартному ctrl+f Накидайте, пожалуйста. |
я не знаток но я такое делал, может не образцово но работало
мы имеем пполе ввода <input type="text" id="search_words">затем кнопку найти <input type="button" onclick="search()">и div где размещен текст(содержание страницы) <div id="container"> text........... </div> function search(){ var words=search_words.value var text=document.getElementById('container').innerHTML var result=text.replace(words,"<span style='background-color:Red; color:White;'>"+words+"</span>"); document.getElementById('container').innerHTML=result; }смысл скрипта что он найдет в тексте container'a нужное слово или несколько слов и заменит его(их) на выделенное(ые) тэгом span который и окрасит фон в красный и сделает цвет шрифта белым у меня работало |
bushstas, достаточно пользователю ввести в поле поиска < или > и вся страница умрет.
Тут нужно последовательно обходить дерево, начиная с листьев — узлов, являющихся конечными и не имеющими дочерних. И двигаться вверх, к корню. Но и это не все решение. Для каждого элемента с дочерними узлами при обработке нужно временно "выкидывать" HTML код, оставляя только обычный текст. |
B@rmaley.e><e,
достаточно function check_words(){ if (event.keyCode==60 || event.keyCode==62){event.returnValue = false} } // а в поле ввода добавить <input type="text" id="search_words" onkeypress="check_words()"> и пользователь просто не сможет ввести знаки < > а если кто-то захочет вставить их копипастом то добавить в поиск еще немножко кода function search(){ var words=search_words.value words=words.replace("<",""); // убиваем в словах поиска нежелательные символы words=words.replace(">",""); var text=document.getElementById('container').innerHTML var result=text.replace(words,"<span style='background-color:Red; color:White;'>"+words+"</span>"); document.getElementById('container').innerHTML=result; } поиск плох тем что он просто топорно-жесткий ни капли не гибкий то есть он найдет только абсолютное совпадение если слово в тексте будет с большой буквы уже все, оно останется без внимания, для этого уже нужно будет повозиться :) а еще я тут подумал что надо будет вырезать из слов поиска и слова типа table div style и все такое которые исчезнув из HTML страницы также убьют ее, это тоже геморрой но все таки можно так сделать а еще можно заблокировать ввод в поле поиска латинских букв, текст то все равно по-русски, тогда мы исключим возможность поиску находить тэги и их свойства, но тогда мы уже не сможем искать английские слова которые часто встречаются в текстах страниц путей наверно много и красиво-умных и коряво-простых |
bushstas, если бы все было так просто... вводим href и страница (ссылки) снова умирает. И таких вариантов можно придумать до бесконечности.
|
Во-первых, при использовании innerHTML создаются новые элементы, т. е. все ранее добавленные обработчики будут потеряны. Во-вторых, как уже сказал B@rmaley, в вышеприведенном варианте не учитывается ситуация когда часть искомого фрагмента содержит тег, например, ищем строку "1234" в строке "aa12<span>34</span>aa" .
|
Сегодня понималась такая же проблемка.
Обсуждение и решение (как вариант) тут |
CKEditor как-то ищет и подсвечивает слова, разбитые тегами :) надо будет посмотреть, как это сделали.
|
ни кто не знает, а есть ли какой нибудь плагин для этой задачи? Третий день пытаюсь реализовать штуку, куча подводных камней всплывает. У же заколебался, а сделать нужно ...
|
Можно сделать вот так Javascript код:
<script type="text/javascript"> var lastResFind=""; // последний удачный результат var copy_page=""; // копия страницы в ихсодном виде function TrimStr(s) { s = s.replace( /^\s+/g, ''); return s.replace( /\s+$/g, ''); } function FindOnPage(inputId) {//ищет текст на странице, в параметр передается ID поля для ввода var obj = window.document.getElementById(inputId); var textToFind; if (obj) { textToFind = TrimStr(obj.value);//обрезаем пробелы } else { alert("Введенная фраза не найдена"); return; } if (textToFind == "") { alert("Вы ничего не ввели"); return; } if(document.body.innerHTML.indexOf(textToFind)=="-1") alert("Ничего не найдено, проверьте правильность ввода!"); if(copy_page.length>0) document.body.innerHTML=copy_page; else copy_page=document.body.innerHTML; document.body.innerHTML = document.body.innerHTML.replace(eval("/name="+lastResFind+"/gi")," ");//стираем предыдущие якори для скрола document.body.innerHTML = document.body.innerHTML.replace(eval("/"+textToFind+"/gi"),"<a name="+textToFind+" style='background:red'>"+textToFind+"</a>"); //Заменяем найденный текст ссылками с якорем; lastResFind=textToFind; // сохраняем фразу для поиска, чтобы в дальнейшем по ней стереть все ссылки window.location = '#'+textToFind;//перемещаем скрол к последнему найденному совпадению } </script> Источник примера: http://adatum.ru/2013/04/01/poisk-i-...tml-stranitse/ |
Часовой пояс GMT +3, время: 16:39. |