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

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

Инфраструктура Ajax позволяет сделать так, чтобы во время выполнения сервером трудоемких операций пользователь не терял контроль над тем, что происходит на стороне клиента. Если процесс обработки довольно длительный, пользователю можно предоставить анимированное GIF-изображение уведомляющее его о происходящем. Кроме того, во время выполнения серверного процесса пользователь сможет производить другие действия, при этом не думая, что браузер "завис".

В данной главе мы используем данную технологию Ajax для создания "живого" поиска. С помощью XSLT (Extensible Stylesheet Language Transformations — расширяемые преобразования языка таблиц стилей) мы будем преобразовывать XML-документ в HTML-структуру. Отметим, что трансляция с помощью XSLT удобнее разбора XML-кода вручную и создания HTML с использованием выражений JavaScript. В ней динамически генерируется XMLдокумент, которым мы заменяем код серверной части сценария и JavaScriptкод, составлявший основу предыдущих проектов. Таким образом, мы больше не будем вручную проверять, что все элементы HTML сформированы надлежащим образом.

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

сAjax и получите готовый компонент поиска, который сможете применять

всобственных проектах.

12.1.Понимание технологий поиска

Мы уже привыкли, что выполнение поиска на сервере "дополняется" демонстрацией застывшей страницы. (По крайней мере, на Web-сайтах, не располагающих кластером из 1 200 серверов, менее чем за секунду выполняющих поиск на 8 миллиардах страниц.) Чтобы убрать паузу, некоторые разработчики создают всплывающие окна и фреймы. Иногда для обработки используется дополнительное окно, что приветствуется пользователями, но также создает определенные проблемы. Используя Ajax, мы можем избежать использования фреймов и привычных задержек в классических операциях отправки форм.

12.1.1. Классический поиск

Рассмотрим классический процесс поиска. Включив форму поиска в Webсайт, мы предполагаем отправлять один или несколько элементов на сервер для дообработки. В качестве примера можно привести основную страницу поиска Google. Эта страница (www.google.com) содержит единственное текстовое окно и две кнопки поиска. В зависимости от выбранного действия форма либо перенаправит нас на список записей (с помощью которых мы можем переходить на требуемые страницы), либо переведет на страницу, соответствующую одной из позиций названного списка. Подобная структура прекрасно подходит для страницы, с которой не связаны никакие другие функциональные возможности, однако если поиск является частью большого

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

Рис. 12.1. Классическая модель поиска с обозначенными этапами обработки

проекта, описанное решение может порождать проблемы — потерю состояния страницы, очистку полей формы и т.д. На рис. 12.1 приведена диаграмма классической модели поиска, когда вся страница отправляется на сервер для обработки, а возвращается совершенно новая страница с результатами

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

В качестве средства борьбы с описанным явлением разработчики используют анимированные GIF-изображения (например, заменяющие собой строку состояния), вызываемые в то время, когда сервер обрабатывает отправленный запрос. Вопрос о том, как это можно сделать, является одним из самых популярных на различных форумах, подобных JavaRanch (www.JavaRanch.com). Однако проблемой анимированных GIF-изображений является то, что они запускаются не всегда. В Microsoft Internet Explorer GIF-анимация часто замирает на первой картинке, не демонстрируя циклически предполагаемый набор изображений. Разработчики знают, что некоторые пользователи, не видя анимации, считают, будто браузер "завис", и щелкают на кнопке обновления или закрывают браузер.

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

Рис. 12.2. Процесс поиска с использованием фреймов

12.1.2.Недостатки использования фреймов

ивсплывающих окон

Для решения проблем кажущегося "зависания" страниц, потери положения прокрутки и т.п. разработчики традиционно применяют фреймы (обычные и IFrame) и всплывающие окна. Фреймы и всплывающие окна позволяют продолжать обработку в другой части Web-страницы, так что пользователь может работать с фрагментом формы, инициировавшим обработку. Причем не только пользователь может манипулировать формой, параллельно могут выполняться и другие функции JavaScript.

Фреймы и всплывающие окна имеют и другие преимущества. Использование фреймов позволяет прокручивать возвращаемый набор записей, оставляя при этом элементы поисковой формы в поле зрения пользователя. Всплывающее окно позволяет отображать результаты в отдельном окне, вынося обработку из основного окна. Правильным образом организовав связь родительского окна с дочерним, можно при возврате результатов передавать данные из дочернего окна в родительское. Всплывающие окна невероятно полезны при внедрении поиска в больших формах, где пользователю требуется определенная трудно запоминаемая информация. Кроме того, можно сделать так, чтобы окно закрывалось после завершения обработки. Это полезно, когда требуется обновить страницу, не передавая на сервер никаких данных.

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

Хотя описанные подходы и решают одну проблему, они приводят к возникновению других. Фреймы были и остаются одним из самых страшных кошмаров разработчиков. Основная проблема, связанная с ними, — это навигация, поскольку мы не знаем, как фрейм будет взаимодействовать с браузером. Мы не знаем, как повлияет на фрейм кнопка "Назад". Вернет ли фрейм нас на нужную страницу, уничтожит ли всю структуру фреймов или просто не сработает? Как правило, именно такие вопросы возникают при тестировании. А что произойдет, если открыть страницу в браузере, не поддерживающем структуры фреймов? Чтобы избежать последней проблемы,

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

на страницу потребуется включить сценарий детектирования фреймов, из-за чего приложение станет более громоздким, управлять кодом станет сложнее, кроме того, возрастет его общая сложность.

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

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

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

12.1.3. "Живой" поиск с использованием Ajax и XSLT

Функциональные возможности поискового элемента Web-сайта можно улучшить, сделав поиск "живым"; именно так некоторые разработчики называют поиск с использованием Ajax. Для выполнения такого поиска не требуется передавать на сервер всю страницу для обработки (как при традиционном поиске), а это означает, что можно поддерживать текущее состояние страницы. Кроме того, без особых проблем можно запустить JavaScript и GIFанимацию, поскольку результаты отображаются в браузере с помощью tnnerHTML или других методов DOM.

Допустим, что у нас есть средство поиска, инициирующее длительную транзакцию базы данных, в ходе которой страница выглядит недоступной. Используя Ajax, можно запустить анимацию в начале транзакции. Когда придет время выводить результаты, свойству CSS display анимированного изображения можно присвоить значение попе, и анимация просто исчезнет. Можно также поместить анимированное изображение там, куда планируется выводить результаты. После завершения транзакции изображение будет заменено результатами. В любом случае пользователь может использовать форму, в то время как объект XMLHttpRequest обрабатывает данные сервера.

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