Поиск по сайту на JavaScript

Как подсказывает мне коллега - эта тема не актуальна, и понятно почему, так как поиск по сайту должен выполняться на стороне сервера, а JS выполняется на стороне клиента. Поиск на JS можно сделать на текущей страницы, это будет удобно пользователю, например, когда на одной странице написана большая статья, читатель вбивает слово, которое он хочет найти в поисковую форму, нажимает кнопку Поиск и на странице сразу выделяются все найденные слова, страница при этом не перезагружается. Тут, сценарий ищет совпадения в пределах документа, который уже загружен (кстати, такое умеет делать практически любой браузер (клавиши Ctrl + F)), а как сделать поиск по всему сайту, даже по тем страницам, которые еще не загружены, как это сделать на чистом JS?

Когда у меня еще не было своего места в интернете (хостинга), под мои странички, я ставил эксперименты на статических страницах (наверно многие так делали|делают). У меня была специальная папка на рабочем столе, где хранились всякие написанные мной "страницы". Вскоре я собрал все эти страницы в одну "кучу" и получился "сайт". Чтобы странички выглядели более привлекательнее, я искал в интернете скрипты на JavaScript и внедрял их в свой первый "проект". Через какое то время, мне в голову бьет идея - внедрить поиск по сайту и сразу полез в поисковик искать скрипт поиска по сайту, но все скрипты, что мне выдал поисковик были написаны на php, а это мне не подходило. Но! Кто ищет, тот всегда найдет! Нашел скрипт написанный на JavaScript, который выполняет поиск по сайту и выводит результаты.

На самом деле сценарий не выполняет поиск по сайту, не сканирует страницы, не делает запроса в базу, он ищет в специальной, подготовленной базе, где были небольшие предложения и адреса страниц, куда должен попасть человек, если нажмет на выбранный пункт в поисковой выдачи. Сценарий пробегает по предложениям и если находит совпадения, то "откладывает" предложение и ссылку, затем выводит список найденного в новом окне. Сценарий называется DB search, скачать его можно тут: {удалено: сайт больше недоступен}. Я его немного исправил, перевел на русский язык, добавил краткое описание, сделал заголовок в виде ссылки и дописал адрес страницы, под описанием, а так же код привел к более современному виду.

Давайте перейдем к форме поиска, вот так она выглядит:
<script type="text/javascript" src="database.js"></script>
<form method="POST" name="finding">
    <input type="text" name="sub" size="20">
    <input type="button" value="Найти" onClick="dolt();"><ul>
</form>

Форма, как форма, ни чего сверхъестественного в ней нет. Над формой подключается JS файл, где у нас будет база для поиска и сценарий, который будет выполнять поиск и выводить результаты на экран. Сам сценарий выглядит так (с моими доработками):
var title       = [];
var description = [];
var address     = [];
var sum         = 2;

title[1]       = 'Поиск по сайту на JavaScript';
description[1] = 'Как подсказывает мне коллега - эта тема не актуальна, и понятно почему, так как поиск по сайту должен выполняться на стороне сервера, а JS выполняется на стороне клиента.';
address[1]     = 'https://danfa.net/blog/197/'; 
 
title[2]       = 'Отображение прогресса выполняемой задачи (JavaScript)';
description[2] = 'Решил, для примера, написать простой скрипт (JS), который отображал бы текущий процент выполнения, какой то задачи. В моем примере будет просто заполняться полоса до полного, а рядом счетчик процентов, до 100%.';
address[2]     = 'https://danfa.net/forum/thread/487/';

function contains(sub, s) {
    var strlen1 = sub.length;
    var strlen2 = s.length;
    var istrue  = false;
    for(var i = 0; i <= strlen2; i++) {
        comp = s.substring(i - 1, strlen2);
        comp = comp.substring(0, strlen1);
        if(comp == sub) {
            istrue = true;
            break;  
        }   
    }

    return istrue;
}

function dolt() {
    var loopCount = 0;
    var Found     = false
    var Item      = document.forms[0].sub.value.toLowerCase();

    var stats ='toolbar = no, location = no, scrollbars = yes, directories = no, status = yes, menubar = no, scrollbars = yes, resizable = yes, height = 500, width = 790, top = 20, left = 20'

    MsgBox = window.open('', 'msgWindow', stats) 
    MsgBox.opener      = window;
    MsgBox.opener.name = 'opener';
    MsgBox.document.write('<!DOCTYPE html><html><head><title>Результат поиска слова: ' + Item + '</title></head><body>');

    if (document.finding.sub.value == '') {
        MsgBox.document.write('<h5><font face="Arial">Список всех ссылок:<hr></h5></font>');
    }
    else {
        MsgBox.document.write('<h5><font face="Arial">Результаты поиска слова: "' + Item + '":<hr></h5></font>');
    }

    for (var i = 1; i <= sum; i++) {
        contains(Item, title[i].toLowerCase());
        if (comp == Item) {
            loopCount++;
            Found = true;

            MsgBox.document.write('<div align="center"><table border="0" width="740" cellpadding="8"><tr><td width="2%" align="center"><font face="Arial" size="2">' + loopCount + '.</font></td><td width="98%" height="18" align="left"><font face="Arial" size="2"><a href="' + address[i] + '" target="_blank"><strong>' + title[i] + '</strong></a></font><br /><font face="Arial" size="2">' + description[i] + '<br /><i>Адрес страницы: ' + address[i] + '</i></font></td></tr></table></div>');
            MsgBox.document.write('<script type="text/javascript">window.status=(' + loopCount + ')</script>');
        }
    }

    if (!Found) {
        MsgBox.document.write('<font face="Arial">Совпадений не найдено.</font>');
    }

    MsgBox.document.write('<hr><font face="Arial">Поиск по сайту на JavaScript</font></body></html>');
    if (loopCount == 0) {
        MsgBox.document.write('<script type="text/javascript">window.status=(0)</script>');
    }
}

База состоит из трех массивов:
  • title - Заголовок страницы.
  • description - Описание страницы.
  • address - Адрес страницы.

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

Надеюсь это кому ни будь пригодиться.
Спасибо за внимание.
Автор: