Написание Web-сценария, выполняющего поиск
Написание Web-сценария, выполняющего поиск
Осталось создать (точнее, переделать уже созданный в главе 20) Web-сценарий, который, собственно, будет выполнять поиск.
Откроем файл Web-сценария main.js в Блокноте и добавим в его начало такое выражение:
var cSearchHeight = 0;
Оно объявляет служебную переменную, в которой будет сохранена изначальная высота контейнера csearch. Это значение мы будем использовать для позиционирования данного контейнера. Его высота в процессе работы будет постоянно меняться, поэтому для его позиционирования нам понадобится изначальное значение высоты.
Далее найдем тело функции, передаваемой методу onReady объекта Ext. В самом его начале поместим два выражения:
Ext.get("search_result"). setDisplayed(false);
cSearchHeight = Ext.get("csearch"). getHeight();
Первое выражение сразу скроет список search_result, а второе присвоит изначальную высоту контейнера csearch объявленной ранее служебной переменной.
Функцию adjustContainers, задающую размеры контейнеров, мы объявили еще в главе 16 и с тех пор ни разу к ней не возвращались. Настала пора внести в объявление этой функции некоторые правки.
Вот выражения, которые мы добавим в самый конец adjustContainers:
var elCSearch = Ext.get("csearch"); elCSearch.setLocation(clientWidth — elCSearch.getWidth(), Ext.get("cmain"). getY() — cSearchHeight);
Они позиционируют контейнер csearch так, чтобы он в любом случае находился над верхним левым углом контейнера cmain. Кстати, здесь используется значение изначальной высоты контейнера csearch, которое мы сохранили ранее.
Теперь найдем объявление функции searchData, написанной нами в главе 20. Переделаем его так, как показано в листинге 21.6.
Листинг 21.6
function searchData() {
var elSearchResult = Ext.get("search_result"); elSearchResult.select("A"). removeAllListeners(); elSearchResult.dom.innerHTML = ""; elSearchResult.setDisplayed(false);
var sKeyword = Ext.get("keyword"). getValue(false);
if (sKeyword!= "") {
var iSearchMode = Ext.getDom("search_in"). selectedIndex;
var aResult = [];
searchInArray(sKeyword, aHTML, aResult, iSearchMode); searchInArray(sKeyword, aCSS, aResult, iSearchMode); searchInArray(sKeyword, aSamples, aResult, iSearchMode); if (aResult.length > 0) {
var s = "";
for (var i = 0; i < aResult.length; i++) {
s += "<LI><A HREF="" + aResult[i].url + "">" +
aResult[i].name + "</A></LI>";
}
var htelResult = elSearchResult.insertHtml("beforeEnd", s); Ext.fly(htelResult). select("A"). on("click", function(e, t) {
var href = Ext.fly(this). getAttribute("href");
var elA = Ext.get("navbar"). child("A[href=" + href + "]");
var elItem = elA.parent("LI");
loadFragment(elItem, e);
});
elSearchResult.setDisplayed(true);
}
}
Рассмотрим листинг 21.6 построчно.
Перед поиском нам нужно удалить все пункты, уже присутствующие в списке search_result. Для этого мы сначала удаляем все обработчики событий, привязанные к гиперссылкам, находящимся в пунктах этого списка, а потом удаляем сами пункты:
var elSearchResult = Ext.get("search_result"); elSearchResult.select("A"). removeAllListeners(); elSearchResult.dom.innerHTML = ""; elSearchResult.setDisplayed(false);
Напоследок скрываем список search_result.
Обратим внимание, как выполняется удаление пунктов списка search_result. Из главы 15 мы знаем, что объект Web-обозревателя HTMLElement поддерживает свойство innerHTML, хранящее HTML-код, создающий содержимое данного элемента Web-страницы, в виде строки. Значит, чтобы удалить все содержимое данного элемента, мы можем получить соответствующий ему экземпляр объекта HTMLElement (через свойство dom объекта Ext Core Element) и присвоить его свойству innerHTML пустую строку. Что мы и делаем.
Листинг 21.7
var sKeyword = Ext.get("keyword"). getValue(false);
if (sKeyword!= "") {
var iSearchMode = Ext.getDom("search_in"). selectedIndex;
var aResult = [];
searchInArray(sKeyword, aHTML, aResult, iSearchMode); searchInArray(sKeyword, aCSS, aResult, iSearchMode); searchInArray(sKeyword, aSamples, aResult, iSearchMode); if (aResult.length > 0) {
var s = "";
for (var i = 0; i < aResult.length; i++) {
s += "<LI><A HREF="" + aResult[i].url + "">" +
aResult[i].name + "</A></LI>";
}
var htelResult = elSearchResult.insertHtml("beforeEnd", s); Ext.fly(htelResult). select("A"). on("click", function(e, t) {
var href = Ext.fly(this). getAttribute("href");
var elA = Ext.get("navbar"). child("A[href=" + href + "]");
var elItem = elA.parent("LI");
loadFragment(elItem, e);
});
Фрагмент кода, приведенный в листинге 21.7, перекочевал из предыдущей реализации функции searchData практически без изменений. Мы уже знаем, что он делает. Сформировав пункты списка search_result, открываем его:
elSearchResult.setDisplayed(true);
}
}
На этом выполнение функции searchData заканчивается.
Функция cleanupSamples, которую мы объявили в главе 16, удаляет обработчики событий, привязанные к гиперссылкам раздела "См. также" и результатам поиска. Найдем объявляющий ее код и удалим выражения, которые убирают обработчики событий у гиперссылок результатов поиска, — ведь ранее мы поместили выполняющий это действие код в функцию searchData. После этого объявление функции cleanupSamples будет выглядеть так, как в листинге 21.8.
Листинг 21.8
function cleanupSamples() {
var ceSamples = Ext.select(".sample"); ceSamples.each(function(el, cl, ind){ var elH6 = el.child(":first"); elH6.removeAllListeners();
});
}
Так, б?льшую часть работы мы сделали. Осталось реализовать скрытие списка search_result при щелчке на содержимом Web-страницы.
Вернемся к телу функции, передаваемой параметром методу onReady объекта Ext, и добавим в его конец такое выражение:
Ext.getBody(). on("click",
function(){ Ext.get("search_result"). setDisplayed(false); });
Оно привязывает к событию click секции тела Web-страницы обработчик, который скрывает список search_result.
В главе 15 мы узнали, что некоторые события, в том числе и click, имеют обыкновение всплывать из элементов, в которых они изначально возникли, в их родители, затем — в родители их родителей и, наконец, в секцию тела Web-страницы. Обработчик события click, который мы только что привязали к секции тела Web- страницы, сработает независимо от того, в каком элементе Web-страницы возникло это событие, и список search_result в любом случае будет скрыт.
Но тут возникает очень неприятный момент: событие click кнопки запуска поиска также рано или поздно всплывет в секцию тела Web-страницы. Давайте посмотрим, что получится в результате. Посетитель нажмет кнопку запуска поиска, функция searchData сформирует пункты списка результатов и откроет этот список, после чего выполнится обработчик события click, привязанный нами к секции тела Web- страницы, который скроет список результатов. Непорядок!
Найдем в теле функции, передаваемой параметром методу onReady объекта Ext, вот это выражение:
Ext.get("find"). on("click", searchData);
Оно привязывает обработчик к событию click кнопки, запускающей поиск. Изменим его следующим образом:
Ext.get("find"). on("click", function(e){
searchData();
e. stopPropagation();
});
Новый обработчик события click сначала вызовет функцию searchData, собственно выполняющую поиск, а потом подавит всплытие возникшего события. Как видим, для этого используется метод stopPropagation объекта Ext Core EventObject (см. главу 15).
И еще. В обработчике события click пунктов полосы навигации (функция loadFragment) у нас подавляется всплытие этого события. Следовательно, если посетитель щелкнет на пункте полосы навигации (или гиперссылке раздела "См. также", или гиперссылке пункта в списке результатов поиска), событие click не всплывет в секцию тела Web-страницы, привязанный к нему обработчик не вы- полнится, и список search_result скрыт не будет. Нам нужно это исправить.
Найдем код, объявляющий функцию loadFragment, и добавим в самый его конец такое выражение:
Ext.get("search_result"). setDisplayed(false);
Что оно делает, мы уже знаем.
Сохраним все исправленные файлы и проверим поиск в действии. Вот теперь он выглядит вполне профессионально!..
Что дальше?
В этой главе мы познакомились со свободно позиционируемыми элементами Web- страницы и даже применили их на практике в новой версии системы поиска. Мелочь, конечно, — иные Web-дизайнеры с помощью свободных элементов творят на Web-страницах чудеса, — но для начала получилось неплохо.
В следующей, последней, главе мы познакомимся с еще одной возможностью HTML 5 — программируемой графикой. Мы научимся рисовать произвольные фигуры на Web-странице. А еще мы наделим наш Web-сайт графическим логотипом.
Более 800 000 книг и аудиокниг! 📚
Получи 2 месяца Литрес Подписки в подарок и наслаждайся неограниченным чтением
ПОЛУЧИТЬ ПОДАРОКДанный текст является ознакомительным фрагментом.
Читайте также
Пример сценария
Пример сценария С помощью приведенного ниже сценария SortNameMSXML.js все записи из book.xml сортируются по фамилии и отображаются в Блокноте. Напомним, что аналогичную задачу для текстового файла с разделителями book.txt реализует сценарий SortName.js, приведенный в листинге 5.21. Алгоритм
Выполнение сценария
Выполнение сценария Открытый в отладчике сценарий может выполняться в разных режимах с помощью соответствующих команд меню Debug.С помощью команды Debug|Run (или нажатия клавиши <F5) можно выполнить все операторы сценария до первой точки прерывания.Для того чтобы выполнить
Написание Web-сценария, выполняющего поиск
Написание Web-сценария, выполняющего поиск Осталось создать (точнее, переделать уже созданный в главе 20) Web-сценарий, который, собственно, будет выполнять поиск.Откроем файл Web-сценария main.js в Блокноте и добавим в его начало такое выражение:var cSearchHeight = 0;Оно объявляет
4 Написание кода
4 Написание кода В предыдущей книге[13] я подробно описал структуру и природу Чистого Кода. В этой главе будет рассмотрен сам акт написания кода, а также контекст, в котором он происходит.Когда мне было 18 лет, я набирал текст достаточно быстро, но мне приходилось смотреть на
Поиск на научных сайтах с использованием платформы Flexum «Поиск по научным сайтам»
Поиск на научных сайтах с использованием платформы Flexum «Поиск по научным сайтам» Тема научного поиска не прошла мимо разработчиков персональных поисковиков. Подробному рассказу о возможностях таких поисковых систем посвящена отдельная глава нашей книги (см. главу 6).
Написание Web-сценария, выполняющего поиск
Написание Web-сценария, выполняющего поиск Осталось написать Web-сценарий, который будет искать Web-страницы, удовлетворяющие заданным посетителем условиям.Откроем файл Web-сценария main.js и поместим где-либо в теле функции, передаваемой в качестве параметра методу onReady объекта
Написание Web-сценария, выполняющего поиск
Написание Web-сценария, выполняющего поиск Осталось создать (точнее, переделать уже созданный в главе 20) Web-сценарий, который, собственно, будет выполнять поиск.Откроем файл Web-сценария main.js в Блокноте и добавим в его начало такое выражение:var cSearchHeight = 0;Оно объявляет
Запуск сценария
Запуск сценария Сценарий можно запустить непосредственно в окне Solution Explorer. Проще всего перетащить сценарий и опустить его на ссылку на базу данных, в которую нужно внести изменения. Или иначе, щелкните правой кнопкой мыши на сценарии и выберите в контекстном меню команду
Яндекс. Поиск – быстрый поиск документов
Яндекс. Поиск – быстрый поиск документов Документы, как известно, имеют премерзкое свойство накапливаться. И чем больше документов, тем труднее в их залежах найти нужный. Электронные документы здесь не слишком отличаются от бумажных. Проблема места для хранения, правда,
2.1. Запуск сценария
2.1. Запуск сценария Запустить сценарий можно командой sh scriptname[ 8 ] или bash scriptname. (Не рекомендуется запуск сценария командой sh <scriptname>, поскольку это запрещает использование устройства стандартного ввода stdin в скрипте). Более удобный вариант -- сделать файл скрипта
Глава 12 Поиск с предпочтением: эвристический поиск
Глава 12 Поиск с предпочтением: эвристический поиск Поиск в графах при решении задач, как правило, невозможен без решения проблемы комбинаторной сложности, возникающей из-за быстрого роста числа альтернатив. Эффективным средством борьбы с этим служит эвристический
16.3. Выполнение сценария
16.3. Выполнение сценария Ниже рассматривается пример, который уже обсуждался ранее. В данном случае, файл называется cleanup.$ pg cleanup#!/bin/sh#имя: cleanup#это общий сценарий, выполняющий очистку echo "starting cleanup…wait"rm /usr/local/apps/log/*.logtail -40 /var/adm/messages /tmp/messagesrm /var/adm/messagesmv /tmp/messages /var/adm/messages echo
18.3.12. Проверка пользователя, выполняющего сценарий
18.3.12. Проверка пользователя, выполняющего сценарий В следующем примере для проверки условия используется переменная среды. Здесь проверяется, присвоено ли переменной LOGNAME значение "root". Обычно этот тип оператора добавляется в начале сценариев в качестве дополнительной
Написание букв
Написание букв Окно программы содержит две вкладки: «Написание букв» и «Графологический анализ».Щелкнув на вкладке «Написание букв», вы попадаете в раздел для определения сильных и слабых качественных черт характера по форме написания букв (рис. 199). Рис. 199Слева
Написание сценария
Написание сценария Итак, с панелью Actions мы вкратце познакомились. Конечно, полностью ее возможности (кстати, весьма широкие) мы не рассмотрели, но сейчас нам важнее написать наш первый сценарий, чем выяснять, чем богата эта панель. Позже мы займемся ей более подробно.Выше