Листинг 16.21

Как уже говорилось, эта функция принимает четыре параметра:

ü искомое слово в виде строки;

ü массив, составляющий базу данных, в котором будет выполняться поиск;

ü массив, в который будут помещаться результаты поиска;

ü число, обозначающее режим поиска. Фактически это номер пункта, выбранного посетителем в раскрывающемся списке search_in.

Результат эта функция возвращать не будет.

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

Объявляем служебные переменные:

var sN, sK;

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

var sKw = "," + sKeyword.toLowerCase();

Посетитель — человек непредсказуемый. Кто знает, в каком регистре он наберет искомое слово — в верхнем или нижнем, прописными буквами или строчными.

А названия Web-страниц нашего Web-сайта указаны как в верхнем, так и в нижнем регистре. И строка, набранная в верхнем регистре, не равна строке, содержащей те же символы, но набранные в нижнем регистре; так, строки "title" и "TITLE", хоть и содержат одни и те же символы, не равны, поскольку эти символы набраны в разных регистрах.

Поэтому перед сравнением строк принудительно преобразуем их к какому-либо одному регистру, скажем, к нижнему. В этом нам поможет метод toLowerCase объекта JavaScript String. Он как раз возвращает строку, равную той, для которой он вызван, но набранную в нижнем регистре. Параметров он не принимает.

Но зачем добавлять к искомой строке спереди запятую?

Предположим, посетитель захотел найти материалы по тегу <IMG>. Причем посетитель попался на редкость ленивый, и, вместо того чтобы набрать имя тега полностью, ввел только букву "I".

Средства JavaScript позволяют узнать, присутствует ли в какой-либо строке указанная подстрока (за это "отвечает" особый метод объекта String). Другими словами, приняв за подстроку введенное посетителем искомое слово, мы с помощью этих средств можем легко узнать, присутствует ли оно в названии или списке ключевых слов какого-либо элемента базы данных. Так, мы выясним, что в строке "IMG" присутствует подстрока "I", а в строке "!DOCTYPE" — нет.

Но подстрока "I" присутствует и в строках "AUDIO", "VIDEO" и "TITLE". При этом мы решили, что будем выбирать только те материалы, начало названий или ключевых слов содержит указанное слово. Начало, а не середина или конец! К сожалению, средства JavaScript не позволяют указать, в какой именно части слова должна присутствовать искомая подстрока.

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

Например, если мы добавим к строкам "I", "IMG" и "AUDIO" спереди запятую, то получим ",I", ",IMG" и ",AUDIO". Посмотрим, что получится: строка ",IMG" содержит подстроку ",I", а ",AUDIO" — не содержит. Принятое нами правило поиска — указанное слово должно содержаться в начале названия — теперь выполняется.

Далее запускаем цикл со счетчиком, который будет просматривать все элементы массива базы данных, переданного вторым параметром:

for(var i = 0; i < aDataArray.length; i++) {

В теле этого цикла мы получаем название очередного элемента этого массива, преобразуем его к нижнему регистру, добавляем к нему спереди запятую и присваиваем объявленной ранее служебной переменной:

sN = "," + aDataArray[i].name.toLowerCase();

Проверяем, есть ли у данного элемента свойство keyword:

if (aDataArray[i].keyword)

sK = "," + aDataArray[i].keyword.toLowerCase()

else

sK = "";

Ранее мы решили, что оно будет необязательным. Если оно есть, преобразуем его значение — список ключевых слов — к нижнему регистру, добавляем к нему впереди запятую и присваиваем объявленной ранее служебной переменной. Если его нет, присваиваем той же служебной переменной пустую строку — "пустой" список ключевых слов.

Если посетитель выбрал первый или третий пункты раскрывающегося списка search_in (т. е. если указан режим поиска по названиям или по названиям и ключе-вым словам; номер выбранного пункта списка search_in передается четвертым па-раметром) и если в названии элемента массива присутствует указанное посетителем слово:

if (((iSearchMode == 0) || (iSearchMode == 2)) && (sN.indexOf(sKw)!= -1))

мы присваиваем этот элемент новому элементу массива результатов, переданного третьим параметром:

aResultArray[aResultArray.length] = aDataArray[i]

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

Если посетитель выбрал второй или третий пункты раскрывающегося списка search_in (т. е. если указан режим поиска по ключевым словам или по названиям и ключевым словам) и если в списке ключевых слов элемента массива присутствует указанное посетителем слово

else

if (((iSearchMode == 1) || (iSearchMode == 2)) && (sK.indexOf(sKw)!= -1))

мы присваиваем этот элемент новому элементу массива результатов, переданного третьим параметром:

aResultArray[aResultArray.length] = aDataArray[i];

}

На этом выполнение тела цикла и тела функции searchInArray заканчивается.

Поиск готов. Откройте наш Web-сайт, наберите в поле ввода какое-либо слово и нажмите кнопку Искать!. Если поиск увенчается успехом, в самом конце контейнера cmain вы увидите список, пункты которого будут содержать гиперссылки на найденные Web-страницы.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: