Организация поиска по веб-странице на JavaScript (без jQuery). Поиск по странице с помощью jQuery Скрипт поиска по странице

  • 28.01.2022

Многие посетители сайтов не знают о поиске по странице по нажатию Ctrl+F и ищут необходимый фрагмент глазами, просто пролистывая текст. Этот способ становится проблематичным, если на странице текста больше, чем три-четыре экрана. Для таких посетителей я решил реализовать поиск по странице с использованием jQuery.
Пример подобного поиска есть на сайте Конституции РФ , но там он работает как-то странно.

ПредупреждениеЯ не профессиональный программист, просьба не пинать за кривой код и возможное изобретение велосипеда.HTML-формаПервым делом разместим на странице HTML-код формы поиска. Форма включает два элемента - поле для ввода текста и DIV для вывода результатов поиска.

CSSЗадаём два стиля: первый - для выделения фрагмента, второй - для ссылки на первый фрагмент.
span.highlight { background-color: #C6D9DB; cursor: pointer; } span.splink { color: #0A5794; cursor: pointer; } Настройка поиска var minlen = 3; // минимальная длина слова var paddingtop = 30; // отступ сверху при прокрутке var scrollspeed = 200; // время прокрутки var keyint = 1000; // интервал между нажатиями клавиш Подсветка фрагментовБазовая функциональность - подсветка фрагментов в тексте. Делается это с помощью регулярных выражений.
function dosearch() { term = jQuery("#spterm").val(); jQuery("span.highlight").each(function(){ //удаляем старую подсветку jQuery(this).after(jQuery(this).html()).remove(); }); var t = ""; jQuery("div.entry-content").each(function(){ // в селекторе задаем область поиска jQuery(this).html(jQuery(this).html().replace(new RegExp(term, "ig"), "$&")); // выделяем найденные фрагменты n = jQuery("span.highlight").length; // количество найденных фрагментов console.log("n = "+n); if (n==0) jQuery("#spresult").html("Ничего не найдено"); else jQuery("#spresult").html("Результатов: "+n); }); } jQuery("#spterm").keyup(function(){ if (jQuery("#spterm").val()!=term) // проверяем, изменилась ли строка if (jQuery("#spterm").val().length>=minlen) { // проверяем длину строки dosearch(); // если все в порядке, приступаем к поиску } else jQuery("#spresult").html(" "); // если строка короткая, убираем текст из DIVа с результатом }); Переход между фрагментамиМало просто выделить фрагменты, гораздо удобнее организовать быстрый переход между ними. Под формой размещаем ссылку перехода на первый найденный фрагмент. Чтобы не занимать место стрелками, клик на каждый фрагмент ведет к следующему. Клик на последний фрагмент возвращает пользователя к форме поиска.
if (n==0) jQuery("#spresult").html("Ничего не найдено"); else jQuery("#spresult").html("Результатов: "+n); if (n>1) // если больше одного фрагмента, то добавляем переход между ними { var i = 0; jQuery("span.highlight").each(function(i){ jQuery(this).attr("n", i++); // нумеруем фрагменты, более простого способа искать следующий элемент не нашел }); jQuery("span.highlight").not(":last").attr({title: "Нажмите, чтобы перейти к следующему фрагменту"}).click(function(){ // всем фрагментам, кроме последнего, добавляем подсказку jQuery("body,html").animate({scrollTop: jQuery("span.highlight:gt("+jQuery(this).attr("n")+"):first").offset().top-paddingtop}, scrollspeed); // переход к следующему фрагменту }); jQuery("span.highlight:last").attr({title: "Нажмите, чтобы вернуться к форме поиска"}).click(function(){ jQuery("body,html").animate({scrollTop: jQuery("#spterm").offset().top-paddingtop}, scrollspeed); // переход к форме поиска }); } Задержка запуска поискаПоиск в большом тексте и подсветка занимают несколько секунд, на которые страница зависает. При наборе длинного слова поиск производится после каждой введённой буквы.
jQuery("#spterm").keyup(function(){ var d1 = new Date(); time_keyup = d1.getTime(); if (jQuery("#spterm").val()!=term) // проверяем, изменилась ли строка if (jQuery("#spterm").val().length>=minlen) { // проверяем длину строки setTimeout(function(){ // ждем следующего нажатия var d2 = new Date(); time_search = d2.getTime(); if (time_search-time_keyup>=keyint) // проверяем интервал между нажатиями dosearch(); // если все в порядке, приступаем к поиску }, keyint); } else jQuery("#spresult").html(" "); // если строка короткая, убираем текст из DIVа с результатом }); БонусДобавим возможность создавать ссылки на любой текст на странице без использования . Достаточно создать ссылку на страницу и добавить #текст.
if (window.location.hash!="") // бонус { var t = window.location.hash.substr(1, 50); // вырезаем текст jQuery("#spterm").val(t).keyup(); // вставляем его в форму поиска jQuery("#spgo").click(); // переходим к первому фрагменту }

Весь код

jQuery(document).ready(function(){ var minlen = 3; // минимальная длина слова var paddingtop = 30; // отступ сверху при прокрутке var scrollspeed = 200; // время прокрутки var keyint = 1000; // интервал между нажатиями клавиш var term = ""; var n = 0; var time_keyup = 0; var time_search = 0; jQuery("body").delegate("#spgo", "click", function(){ jQuery("body,html").animate({scrollTop: jQuery("span.highlight:first").offset().top-paddingtop}, scrollspeed); // переход к первому фрагменту }); function dosearch() { term = jQuery("#spterm").val(); jQuery("span.highlight").each(function(){ //удаляем старую подсветку jQuery(this).after(jQuery(this).html()).remove(); }); var t = ""; jQuery("div#content").each(function(){ // в селекторе задаем область поиска jQuery(this).html(jQuery(this).html().replace(new RegExp(term, "ig"), "$&")); // выделяем найденные фрагменты n = jQuery("span.highlight").length; // количество найденных фрагментов console.log("n = "+n); if (n==0) jQuery("#spresult").html("Ничего не найдено"); else jQuery("#spresult").html("Результатов: "+n+". Перейти"); if (n>1) // если больше одного фрагмента, то добавляем переход между ними { var i = 0; jQuery("span.highlight").each(function(i){ jQuery(this).attr("n", i++); // нумеруем фрагменты, более простого способа искать следующий элемент не нашел }); jQuery("span.highlight").not(":last").attr({title: "Нажмите, чтобы перейти к следующему фрагменту"}).click(function(){ // всем фрагментам, кроме последнего, добавляем подсказку jQuery("body,html").animate({scrollTop: jQuery("span.highlight:gt("+jQuery(this).attr("n")+"):first").offset().top-paddingtop}, scrollspeed); // переход к следующему фрагменту }); jQuery("span.highlight:last").attr({title: "Нажмите, чтобы вернуться к форме поиска"}).click(function(){ jQuery("body,html").animate({scrollTop: jQuery("#spterm").offset().top-paddingtop}, scrollspeed); // переход к форме поиска }); } }); } jQuery("#spterm").keyup(function(){ var d1 = new Date(); time_keyup = d1.getTime(); if (jQuery("#spterm").val()!=term) // проверяем, изменилась ли строка if (jQuery("#spterm").val().length>=minlen) { // проверяем длину строки setTimeout(function(){ // ждем следующего нажатия var d2 = new Date(); time_search = d2.getTime(); if (time_search-time_keyup>=keyint) // проверяем интервал между нажатиями dosearch(); // если все в порядке, приступаем к поиску }, keyint); } else jQuery("#spresult").html(" "); // если строка короткая, убираем текст из DIVа с результатом }); if (window.location.hash!="") // бонус { var t = window.location.hash.substr(1, 50); // вырезаем текст jQuery("#spterm").val(t).keyup(); // вставляем его в форму поиска jQuery("#spgo").click(); // переходим к первому фрагменту } });

НедостаткиНа больших страницах (примерно 60 кб текста) скрипт зависает на пару минут. имя ключа параметра. Для поля поиска чаще всего применяется «q» или «text». значение ключа параметра. Чаще всего не задаётся. Пользователь может его изменить на свой текст, если не указаны атрибуты readonly и disabled . заблокировано изменение пользователем заблокированы доступ, изменение пользователем и передача данных текущего параметра поле не может быть пустым шаблон ввода как в регулярных выражениях JS , следование которому необходимо для отправки формы минимальное количество символов, необходимое для отправки формы максимальное количество символов, которое может набрать пользователь длина поля в символах подсказка-заглушка всплывающая подсказка при наведении курсора мышки автозаполнение. Современные браузеры показывают ранее введённые поисковые запросы на текущем домене. Можно его отключить или сделать более конкретизированным. список рекомендованных запросов проверяется орфография и грамматика фокус поля (то есть период между щелчком по элементу и щелчком вне элемента) получен при загрузке документа

Убрать в поле поиска крестик «Очистить», удаляющий ранее набранный текст input::-ms-clear { /* нестандартный псевдоэлемент IE */ display: none; } input::-webkit-search-cancel-button { /* нестандартный псевдоэлемент WebKit/Blink , но Esc по-прежнему будет удалять раннее введённый текст */ display: none; } Как работает форма поиска на сайте Самый простой HTML-код

Если набрать в поле «вопрос» и щелкнуть по кнопке «Найти», то адрес страницы изменится с « http://сайт/2011/06/forma-poiska-po-saitu..html?text=вопрос », как это происходит при нажатии на ссылку . При загрузке страницы, скрипт проверяет наличие заданных параметров в URL и при их обнаружении формирует и отображает результаты поиска по сайту.

Но в целях увеличения скорости загрузки документа, скрипт, обрабатывающий запрос, как правило, помещают только на одну страницу сайта, на которую будет сделан переход, если её адрес прописать в атрибуте action: « http://сайт/search/ ?text=вопрос ».

Для работы скрипта могут понадобиться дополнительные параметры, которые указываются в . Это поле не отображается.?searchid=808327 &text=вопрос ».

Результат работы формы открыть в новой вкладке с помощью атрибута target Где взять скрипт поиска по сайту

Можно воспользоваться

  • предложенным специальными сервисами Яндекса и Google ,
  • встроенным в используемую CMS (при наличии), например, на Blogger на « https://site.ru /search?q=вопрос », где « site.ru » заменить на свой адрес блога,
  • разработанным самостоятельно, например, на PHP.

Самый простой вариант - перенаправить запрос Google:>

Обновленный ответ :

Сначала я не понял, что вы хотите вызвать веб-страницу, которой вы не контролируете, а затем использовать JavaScript в своем браузере для взаимодействия с ней.

Информация в первоначальном ответе ниже по-прежнему актуальна, но возникает вопрос: как заставить код работать в правильном контексте? И ответ: Есть как минимум два способа:

    В любом приличном браузере в наши дни есть встроенные средства отладки. Посмотрите на меню для них, но во многих браузерах они доступны через клавишу F12 или Ctrl + Shift + I. В этих инструментах вы найдете "консоль", где вы можете ввести JavaScript и запустить его в контексте страницы, на которую вы смотрите.

    Это отлично подходит для выполнения действий в интерактивном режиме, но это немного больно повторять его каждый раз. Вы также можете поместить код в локальный файл (например, /home/tjc/foo.js), а затем, когда вы перейдете на страницу, используйте консоль, чтобы добавить этот script на страницу (что приведет к ее выполнению в контексте страница), например:

    Document.documentElement.appendChild(document.createElement("script")).src = "file:///home/tjc/foo.js";

    Как только ваш script сделает то, что вы хотите, вы можете превратить его в bookmarklet . Это закладка браузера с использованием схемы javascript: , а не обычной http: и т.д. Подробнее см. Ссылку. Вам понадобится инструмент, который возьмет ваш код JavaScript и сделает для вас необходимую URL-кодировку, например Bookmarklet Crunchinator или аналогичный.

Оригинальный ответ :

Так что он найдет текст или получит элемент по id/class...

Это три очень разных вопроса:

    Чтобы найти текст на странице, у вас есть несколько вариантов:

    • Если вы хотите только найти текст, но не заботитесь о том, какой элемент содержит его, вы можете просто просмотреть innerHTML on document.body . innerHTML - строка; при доступе к нему браузер создает строку HTML для всех элементов DOM в элементе, на который вы его вызываете (и его потомках). Обратите внимание, что это не исходный контент с сервера; это создается "на лету" при доступе к элементу. Для многих случаев использования получение этой строки, а затем ее просмотр может быть полезным. Обратите внимание, что текст, который вы просматриваете, является разметкой, например, если вы искали слово "таблица", вы можете найти его в предложении ("Мы сели за стол") или в разметке (

      ...).

      Здесь приведен пример подсчета слова I"m на странице с помощью innerHTML: живая копия

      (function() { var pageText = document.body.innerHTML; display("Count of "I\"m" on the page: " + pageText.match(/I"m/g).length); function display(msg) { var p = document.createElement("p"); p.innerHTML = String(msg); document.body.appendChild(p); } })();

      Если вам нужно выяснить, в каком именно элементе он находится, вам нужно будет написать рекурсивную функцию, проходящую через узлы страницы, и для Text , просматривает текст внутри. Вот базовый пример (функция - это функция walk): Живая копия | - см. примечание о примерах в конце.

      (function() { var matches = , index; walk(matches, document.body, ""); function walk(matches, node, path) { var child; switch (node.nodeType) { case 1: // Element for (child = node.firstChild; child; child = child.nextSibling) { walk(matches, child, path + "/" + node.tagName); } break; case 3: // Text if (node.nodeValue.indexOf("I"m") !== -1) { matches.push("Found it at " + path); } break; } } display("Matches found (" + matches.length + "):"); for (index = 0; index < matches.length; ++index) { display(matches); } function display(msg) { var p = document.createElement("p"); p.innerHTML = String(msg); document.body.appendChild(p); } })();

      Чтобы найти элемент на странице id , используйте

      Здравствуйте уважаемые читатели блога LifeExample, все мы пользуемся электронным поиском по странице в наших веб браузерах при помощи горячих клавиш CTRL+F либо F3. И кажется уже от таких привилегий нам никуда не деться, так как самостоятельно читать все содержимое страницы, зачастую бывает некогда. Беда в том, что далеко не все начинающие пользователи знают о таких скрытых возможностях любого браузера, но им можно помочь, прикрутив самодельный JavaScript поиск по странице, в тех проектах, где без него совсем никак.

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

      Искать на странице нужную информацию будет удобнее, если для этого реализовать соответствующий интерфейс:

      В поле нужно ввести слово для поиска и нажать кнопку «Искать», тут все интуитивно понятно. Давайте перейдем к реализации самого механизма поиска по странице и посмотрим, какие могут быть нюансы при его реализации.

      Как искать слово на странице?
      Нужно проверить корректность ввода данных, в нашем случае мы только обрежем пробельные символы по бокам фразы для поиска, а также просто проверим на саму форму на наличие в ней поискового запроса.
      Так как данные статичны, и хранятся только в DOM’e страницы, то поиск по ней будет производиться именно по содержимому DOM (Document Object Model).
      Важным является, показать пользователю все результаты, которые нашел наш JavaScript поиск. Т.е. подсветить фон под найденными частями содержимого страницы.
      Так как этот мини модуль поиска по странице имеет смысл подключать только к большим страницам, которые имеют прокрутку, то при наличии найденной фразы, где-то вне зоны видимости неплохо будет прокрутить scroll до найденного элемента.
      Повторное использование поиска, также является важным моментом в работе данного скрипта. Т.к. подсветка найденных частей является результатом изменения содержимого DOM объекта, то каждый последующий цикл поиска должен затирать результаты предыдущего и возвращать содержимое страницы к исходному виду, для дальнейших изменений новой итерации.
      Ну, так вкратце вроде бы и все. Несмотря на объемность выделенных пунктов, реализация их не занимает много времени и места в коде, вот готовый скрипт для механизма 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"),""+textToFind+""); //Заменяем найденный текст ссылками с якорем;
      lastResFind=textToFind; // сохраняем фразу для поиска, чтобы в дальнейшем по ней стереть все ссылки
      window.location = "#"+textToFind;//перемещаем скрол к последнему найденному совпадению
      }


      JavaScript поиск по странице



      Введите слово или фразу для поиска.


      ТоварВесСтоимость



      Монитор 19 дюймов1 кг1900 руб.
      монитор 18 дюймов2 кг1800 руб.
      Монитор 20 дюймов2 кг1900 руб.


      Попробуйте, протестировать поисковыми запросами «19», «2 кг» и другими. Также советую проверить авто скролинг, для этого добавляйте текст до тех пор пока справа не появится полоса прокрутки.

      Вот так выглядит пример использования скрипта:

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

      Реализованный в данной статье, с помощью языка JavaScript , поиск по странице валиден во всех браузерах, включая Internet Explorer.