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)

andikk 11.01.2010 09:08

Форма для поиска по странице средсвами javascript
 
Очень нужен код, который бы отображал на страничке поле ввода и кнопку "Найти".
Нужно чтобы после ввода строки в поле ввода и нажатия на кнопку "Найти" осуществлялся поиск по текущей странице. Найденная строка должна подсвечиваться цветом.
В общем замена стандартному ctrl+f

Накидайте, пожалуйста.

bushstas 11.01.2010 14:56

я не знаток но я такое делал, может не образцово но работало

мы имеем пполе ввода
<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 который и окрасит фон в красный и сделает цвет шрифта белым

у меня работало

B@rmaley.e><e 12.01.2010 08:19

bushstas, достаточно пользователю ввести в поле поиска < или > и вся страница умрет.

Тут нужно последовательно обходить дерево, начиная с листьев — узлов, являющихся конечными и не имеющими дочерних. И двигаться вверх, к корню.
Но и это не все решение. Для каждого элемента с дочерними узлами при обработке нужно временно "выкидывать" HTML код, оставляя только обычный текст.

bushstas 12.01.2010 10:26

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 страницы также убьют ее, это тоже геморрой но все таки можно так сделать

а еще можно заблокировать ввод в поле поиска латинских букв, текст то все равно по-русски, тогда мы исключим возможность поиску находить тэги и их свойства, но тогда мы уже не сможем искать английские слова которые часто встречаются в текстах страниц

путей наверно много и красиво-умных и коряво-простых

B@rmaley.e><e 12.01.2010 11:24

bushstas, если бы все было так просто... вводим href и страница (ссылки) снова умирает. И таких вариантов можно придумать до бесконечности.

Riim 12.01.2010 16:39

Во-первых, при использовании innerHTML создаются новые элементы, т. е. все ранее добавленные обработчики будут потеряны. Во-вторых, как уже сказал B@rmaley, в вышеприведенном варианте не учитывается ситуация когда часть искомого фрагмента содержит тег, например, ищем строку "1234" в строке "aa12<span>34</span>aa" .

jetli13 12.01.2010 16:59

Сегодня понималась такая же проблемка.
Обсуждение и решение (как вариант) тут

Octane 12.01.2010 17:41

CKEditor как-то ищет и подсвечивает слова, разбитые тегами :) надо будет посмотреть, как это сделали.

jetli13 30.07.2010 19:03

ни кто не знает, а есть ли какой нибудь плагин для этой задачи? Третий день пытаюсь реализовать штуку, куча подводных камней всплывает. У же заколебался, а сделать нужно ...

adatum.ru 02.04.2013 06:06

Можно сделать вот так 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, время: 08:21.