Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Ajax_v_deystvii.pdf
Скачиваний:
34
Добавлен:
05.03.2016
Размер:
5.83 Mб
Скачать

Глава 12. "Живой" поиск с использованием XSLT 485

Цикла DOM XML на стороне клиента можно избежать, если перед отправкой клиенту сформировать на сервере вместо XML-файла таблицу HTML. Используя такую технологию, мы соединяем дескрипторы HTML в большую строку, подобно тому, как мы формировали XML-документ. Однако теперь вместо дескрипторов XML применяются элементы таблицы. Строка HTML-кода возвращается клиенту, где ее можно присвоить свойству innerHTML элемента. В данном случае использцется свойство responseText объекта XMLHttpRequest, поскольку нам не требуется проходить по узлам.

Недостаток описанной технологии заключается в том, что мы должны динамически обработать данные и создать таблицу (либо на стороне сервера, либо на стороне клиента). Если в будущем потребуется изменить формат таблицы, то в зависимости от сложности таблицы это может оказаться проблематичным. Добавление или удаление столбца может представлять проблему, поскольку мы должны будем изменить код внутри цикла. Кроме того, следует учесть, что в нашей строке содержатся кавычки; необходимо убедиться, что при создании строки они были представлены правильными управляющими последовательностями. Кроме того, если мы введем JavaScript-код в дескриптор HTML, то получим еще больше двойных и одинарных кавычек, с которыми нужно что-то делать, — необходимо проверить, что все дескрипторы правильно отформатированы и закрыты. Единственная возможность сделать все это — изучить текст после создания строки.

Чтобы избежать данных проблем, мы можем использовать XSLT. Применяя инфраструктуру Ajax, можно объединить XSLT-файл с XMLдокументом и отобразить результаты, не прибегая к использованию методов DOM. Если разработчик знает XSLT, но не является асом в использовании JavaScript, данное решение может быть превосходным.

Обсуждая поиск Ajax, следует отметить, что он не требует дообработки на сервере, следовательно, URL страницы не изменяется, чтобы соответствовать результатам поиска. Таким образом, создавая закладку на URL, мы не получим требуемых результатов поиска. В классических приложениях поиска, подобных Google, мы можем легко копировать URL со страницы, сформированной при поиске, вставить его в электронное письмо, и когда получатель щелкнет на такой ссылке, он увидит искомые результаты. Однако при Ajaxпоиске такую возможность необходимо закодировать отдельно. Подробности этого процесса рассмотрены в разделе 12.5.4.

12.2. Код клиентской части сценария

Технология форматирования XML-данных с использованием XSLT довольно популярна, поскольку XML-файл обладает структурой, легко поддающейся обработке. В предыдущих проектах (например, в приложении опережающего ввода, рассмотренном в главе 10) мы использовали JavaScript, XML и DOM для создания отображаемого HTML-кода. В данном примере для получения того же эффекта мы будем использовать XSLT.

XSLT позволяет форматировать данные, формируя структуру HTML в другом файле и объединяя его с документом XML. Файл XSLT отвечает

486 Часть IV Ajax в примерах

за все, кроме навигации по узлам XML и построения таблиц, меню и HTMLструктуры. Используя Ajax, мы можем извлечь статический или динамический файл XML и статический или динамический файл XLST с сервера, объединив их на стороне клиента для создания HTML-доку мента. Всю работу с XSLT можно выполнить и на стороне сервера, но мы будем рассматривать преобразования на стороне клиента.

12.2.1. Настройка клиента

В данном проекте мы рассмотрим поиск в телефонной книге по имени пользователя. Для этого используется одно текстовое окно и одна кнопка Отправить. Форма поиска показана в листинге 12.1.

Листинг 12.1. Форма клиентской части приложения

<form name="Forml" ID="Forml" onsubmit="GrabNumber();return false;">

// О Добавить обработчик onsubmit

Name: <input name="user" type="text"/> // 0 Вставить текстовое окно

<input type="submit" name="btnSearch" value="Search" />

//© Добавить кнопку отправки <br/Xbr/>

<div id="results"></div>

//О Добавить элемент d i v для результатов </form>

Для инициализации "живого" поиска к дескриптору form необходимо добавить обработчик событий. Обработчик событий onsubmit О перехватывает нажатие клавиши <Enter>, если указатель мыши расположен в текстовом окне, а пользователь щелкает на кнопке Отправить. Данный обработчик событий вызывает функцию GrabNumber(), инициирующую XMLHttpRequest без возврата формы на страницу. (В реальной ситуации необходимо проверить, не отключил ли пользователь JavaScript. В таком случае форма будет отправляться на сервер, и для поддержки подобных пользователей можно использовать классическую форму поиска. Впрочем, в данном проекте мы такую возможность не рассматриваем.)

Созданная нами форма является базовым вариантом, содержащим только обработчик событий, инициирующий XMLHttpRequest. Для сбора пользовательских критериев поиска к форме добавлены текстовое окно © и кнопка Отправить ©. Если мы хотим чего-то необычного, к текстовому окну можно еще добавить обработчик событий onblur, вызывающий функцию GrabNumЬег (); в таком случае поиск будет запущен тогда, когда текстовое окно перестает находиться в фокусе В данном примере активизация поиска связана с обработчиком событий onsubmit.

Затем в документ добавляется элемент div О, в который будут выводиться результаты поиска. Его можно разместить в любом месте станицы. в котором мы желаем видеть результаты. К div добавляется идентифика-

Глава 12 "Живой" поиск с использованием XSLT 487

тор, поэтому мы можем ссылаться на этот элемент при добавлении результатов и GIF-анимации. Отметим, что использовать данный элемент для вывода результатов не обязательно. Их можно выводить в ячейку таблицы или даже в элемент span. Фактически можно использовать любой элемент HTML, свойством innerHTML которого мы можем манипулировать. Мы выбрали элемент div потому, что это блочный элемент, содержащий разрыв строки перед началом и после конца элемента. Кроме того, div занимает 100% доступной ширины браузера, из-за чего он больше подходит для выдачи пользователю больших таблиц результатов.

Важно отметить, что обработчик событий onsubmit должен возвращать значение false при выполнении обработчика. Это уведомляет браузер, что форму не нужно отправлять на сервер, что инициировало бы обновление всей страницы и прервало бы JavaScript-программу формы. Обработка возвращаемого значения приведена в листинге 12.2.

12.2.2. Инициализация процесса

В данном примере мы используем на сервере два файла: документ XML и документ XSL. Документ XML динамически создается РНР, когда этого требует клиент. PHP-код принимает то, что пользователь ввел на страницу, инициирует запрос к базе данных, а затем форматирует результаты в виде XML-документа. Статический документ XSL превращает наш динамический XML-файл в документ HTML. Поскольку документ XSL статический, его не требуется создавать серверу в момент клиентского запроса, это можно сделать заблаговременно.

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

ЦЦистинг 12.2. Функция инициализации 'ШШЩШШШШШ1ШШШ function GrabNumber(){

// Создать функцию

v a r urlXML='PhoneXML.php?q=' + d o c u m e n t . F o r m l . u s e r . v a l u e ;

//О Сформировать URL XML

va r urlXSL=•Phone.xsl' ;

//© Сформировать URL XSL

va r newlmg=document . createElement('img' ) ;

//© Создать элемент изображения

n e w l m g . s e t A t t r i b u t e ( ' s r c ' , ' i m a g e s / l o a d i n g . g i f ) ; // О Установить источник

d o c u m e n t . g e t E l e m e n t B y I d ( " r e s u l t s " ) . a p p e n d C h i l d ( n e w l m g ) ;

//© Добавить изображение на страницу LoadXMLXSLTDoc{urlXML,urlXSL,"results");

//0 Начать загрузку

Данная функция собирает информацию, требуемую для вызова сервера, устанавливает изображение, которое будет отображаться в процессе обра-

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]