Немного об AJAX
Автор: Артемьев Сергей Игоревич ICQ: 438856621 email: _spin_@bk.ru |
Ajax (читается как «аякс» или "аджакс") – это эволюция JS. Обычные скрипты JS, которые мы использовали в примерах, начинают свою работу с загрузки страницы и заканчивают при ее закрытии (или раньше, если выполнились полностью). Обновление страницы (по кнопке «обновить») браузера равносильно ее закрытию и последующему открытию, а это значит, что скрипт будет опять выполняться с самого начала. Например:
<script type="text/javascript" language="javascript"> var myCounter = 0 function runMultiple() { var cntDiv = document.getElementById("counter"); if(cntDiv) { cntDiv.innerHTML = myCounter; cntDiv.style.backgroundColor = '#' + (myCounter + 100) * 1234; myCounter++; } } var timerMulti = window.setInterval("runMultiple();", 1000); </script> ... <div id="counter" style="border:1px dotted blue; top:100px;left:100px;position:absolute; width:50px;height:20px;text-align:center;"> 0 </div>
Как видите, при обновлении страницы счетчик всегда сбрасывается в исходное значение.
Иногда такое выполнение бывает очень неудобным. Представьте, что вы загрузили фотогалерею фотографий высокого разрешения (а значит и большого размера). Одна из них вам понравилась, и вы решили поставить ей оценку «отлично». Выбираете нужную оценку и жмете на кнопку «Оценить». Браузер пошлёт оценку на сервер, который занесёт её в базу и вернёт браузеру пересчитанную среднюю оценку. Но чтобы отобразить ее , браузер перезагрузит всю страницу (обновит её). Естественно будут перезагружены и все картинки, а это лишний трафик и время ожидания.
Рассмотренный пример называется синхронным выполнением, т.е. скрипт выполняется синхронно с документом. Технология AJAX (расшифровывается как "Асинхронный JavaScript") позволяет скрипту работать как-бы независимо от основной страницы. Почему "как-бы" вы поймете после изучения данного урока.
Внутреннее устройство Ajax достаточно сложное и понимание его требует от программиста хороших глубоких знаний. Мы не будем вдаваться в дебри протоколов, а воспользуемся готовой библиотекой, например JsHTTPRequest. Эта библиотека предоставляет простой и понятный механизм использования Ajax для программистов даже с небольшим опытом.
Для начала работы надо скачать библиотеку, например отсюда. Кроме того, нам понадобится сервер, где мы будем размещать серверную часть Ajax. Серверная часть в данном случае состоит из нескольких скриптов на языке PHP ( файлов библиотеки JsHTTPRequest и файла нашего скрипта обновления оценок). В качестве сервера можно взять Denver, ZendCore или что-то подобное.
Итак, изменим предыдущий пример таким образом, чтобы счетчик не сбрасывался при посылке данных на сервер.
Скрипт счётчика остаётся прежним:
<script type="text/javascript" language="javascript"> var myCounter = 0 function runMultiple() { var cntDiv = document.getElementById("counter"); if(cntDiv) { cntDiv.innerHTML = myCounter; cntDiv.style.backgroundColor = '#' + (myCounter + 100) * 1234; myCounter++; } } var timerMulti = window.setInterval("runMultiple();", 1000); </script>
Добавим подключение библиотеки JsHTTPRequest и специальный метод для обработки клика на кнопке оценки:
// подключаем файл библиотеки <script src="JsHttpRequest.js"></script> <script type="text/javascript" language="JavaScript"> function doLoad(value) { // Создаём новый объект JsHttpRequest var req = new JsHttpRequest(); // Определяем код функции, который будет // автоматически вызван по окончании // запроса к серверу req.onreadystatechange = function() { if (req.readyState == 4) { // Записываем результаты в соответствующий блок document.getElementById('result').innerHTML = '<b>Оценка пользователя: ' + req.responseJS.usrMark+ '<br> ' + '<b>Новая средняя оценка: ' + req.responseJS.avgMark+ '<br> '; // Выводим возможные ошибки и отладочную инфу document.getElementById('debug').innerHTML = req.responseText; } } // Готовим подключение к серверной части req.open(null, 'smpl_backend.php', true); // Посылаем данные на сервер req.send( { mark: value } ); } </script>
Осталось добавить немного HTML-кода для кнопки и размещения результатов:
<form> Ваша оценка: <input type="text" name="text" /> <input type="button" value="Оценить" onclick="doLoad(this.form.text.value)" /> </form> <div id="result" style="border:1px solid #000; padding:2px"> Блок результатов </div> <div id="debug" style="border:1px dashed red; padding:2px"> Блок ошибок и отладочной информации </div>
Этот скрипт работает следующим образом: при нажатии на кнопку «отправить» вызывается метод объекта JsHTTPRequest, с параметром в виде массива значений. Массив может иметь любой формат и содержать практически любые данные. Одновременно с этим мы описываем так называемую «callback» функцию. Эта функция (функция обратного вызова onreadystatechange) будет вызвана, когда будет получен ответ от сервера и надо будет обработать результаты. Наша функция просто отображает результаты запроса в соответствующих блоках.
В общем виде выполнение Ajax происходит в 3 этапа:
- Подготовка данных и интерфейса (например, блокировка полей ввода и отображение картинки с бегущей строкой или часами);
- Передача данных и ожидание результата;
- Обработка полученных результатов с помощью функции обратного вызова (например, скрытие картинки ожидания, отображение результатов и ошибок, разблокировка полей ввода).
Теперь рассмотрим серверную часть:
<?php // подключаем AJAX-объект require_once "JsHttpRequest.php"; // Создаём экземпляр AJAX-объекта и // обязательно указываем кодовую страницу $JsHttpRequest =& new JsHttpRequest("windows-1251"); // Получаем данные, переданные браузером пользователя $userMark = @$_REQUEST['mark']; $averageMark = $userMark + rand(1, 10); // сохраняем результаты в выходной массив $GLOBALS['_RESULT'] = array( "usrMark" => $userMark, "avgMark" => $averageMark ); ?>
В данном случае мы не учитываем предыдущие оценки, а для примера меняем оценку пользователя на случайную величину в диапазоне от 1 до 10.
Как видите, использовать Ajax довольно несложно. Главное правильно описывать передаваемые и возвращаемые параметры, а также постоянно помнить, что скрипт выполняется асинхронно, а значит надо предупреждать пользователя о необходимости подождать. Но иногда бывают ситуации, когда получить ответ становится невозможно (разрыв соединения, отключение сервера или отказ в обслуживании из-за перегрузки). В этом случае на помощь придёт специальный таймер, который взводится в момент отправки данных на сервер. Этот таймер срабатывает через заданный разработчиком промежуток времени (например, 30 секунд), сообщает пользователю об ошибке, разблокирует кнопки и поля ввода, а так же может попросить пользователя повторить попытку позже.
Использование Ajax дает разработчику массу полезных и эффективных способов построения интерфейса страницы. Опытный программист может создать веб-страницу, мало отличающуюся по внешнему виду и функциональности от обычного приложения. Яркий пример – сервис gmail, любимый многими пользователями за простоту и удобство.