Форма для поиска по странице средсвами 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/ |
You are doing it wrong.
Нормальные люди делают это через Selection/Range. |
Пытался я мудрить с innerText + Range. Ничего не получилось. Не нашел я возможности задать выделение используя позиции символов (setStart, setEnd принимают индексы дочерних узлов, а не символов). Не говоря уже о Firefox..
Aetae, если можно - вкратце алгоритм. Или ссылочку. |
Всё проще: стандартный 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, время: 04:51. |