====== Принцип AJAX технологии ======
В сети все чаще можно встретить сайты, которые используют, так называемое обновление данных без перезагрузки страницы. Это и есть технология [[wp>Ajax_(programming)|AJAX]]. AJAX позволяет сократить трафик, нагрузку на сервер, а как результат поднять производительность системы.
Однако надо понимать, что AJAX это не самостоятельная технология, а некая концепция использования нескольких технологий.
Прежде чем начать разбираться с AJAX, давайте вначале взглянем на процесс происходящий при обычном общении браузера и сервера.
===== Синхронный запрос =====
Итак вы зашли на некую страничку и нажали на какую-нибудь ссылку или заполнили форму регистрации. При этом происходит следующее:
- Браузер формирует некий запрос (на получение новой странички или для обработки заполненной формы).
- Браузер отправляет запрос на Сервер и блокирует управление страничкой.
- Сервер обрабатывает полученный запрос и формирует ответ.
- Браузер получает данные от Сервера и выводит их на страничку.
- Браузер передает управление страничке.
Другими словами, при запросе нам нужно подождать пока Сервер обработает запрос и Браузер отобразит ответ. Надо отметить, что все подключаемые стили и скрипты будут получены заново.
Как вы уже заметили у нас есть два участника всех событий - Браузер и Сервер. Давайте взглянем, что можно получить используя технологию AJAX.
===== AJAX (асинхронный) запрос =====
Технология AJAX позволит нам отправить запрос на сервер и при этом не блокировать управление страницой, а когда прийдет ответ - обновить часть страницы. При этом все подключенные стили и скрипты останутся неизменными (не будут повторно загружаться).
Что же получается:
- JavaScript готовит некие данные для передачи Серверу и сообщает Браузеру, что пора отправлять.
- Браузер отправляет запрос серверу и сразу возвращает управление странице.
- Сервер обрабатывает полученный запрос и формирует ответ.
- Браузер получает данные от Сервера и передает их в JavaScript.
- JavaScript обновляет страничку.
Как видно из описания процесса нам не нужно ждать пока запрос обработается сервером, а можно сразу продолжать работать. К тому же у нас появился третий участник процесса - JavaScript.
Принцип работы очень прост, но давайте же рассмотрим все на практике.
===== Практика =====
Вначале мы рассмотрим различные реализации клиентского кода написанного на JavaScript. Далее посмотрим на серверный код, написанный на PHP.
==== Код на стороне клиента (JavaScript) ====
=== Объект XMLHttpRequest ===
Объект [[wp>XMLHttpRequest|XMLHttpRequest]] позволяет оправлять запросы напрямую к веб-серверу и загружать данные ответа сервера напрямую в вызывающий скрипт. Этот объект реализован во всех современных браузерах, однако, создание объекта отличается (мы все любим IE).
Алгоритм работы будет следующим:
- Создание экземпляра объекта XMLHttpRequest.
- Открытие соединения.
- Установка обработчика события (нужно делать после открытия и до отправки в IE).
- Отправка запроса.
== Создание объекта ==
Как я говорил выше, в разных браузерах создание XMLHttpRequest реализовано по разному, поэтому предлагаю вам сразу написать универсальную функцию создания:
JavaScript:
function ajaxRequest() {
if(typeof XMLHttpRequest === 'undefined') {
XMLHttpRequest = function() {
try {
return new ActiveXObject("Msxml2.XMLHTTP");
}
catch(e) {}
try {
return new ActiveXObject("Microsoft.XMLHTTP");
}
catch(e) {}
throw new Error("This browser does not support XMLHttpRequest.");
};
}
return new XMLHttpRequest();
}
var request = new ajaxRequest();
== Открытие соединения ==
Соединение с сервером открывается методом open() с передачей следующих параметорв:
* тип запроса - в общем случаи POST или GET.
* URL по которому отправляется запрос.
* флаг асинхронно/синхронно (да и тут можно отправить обычный запрос).
* логин пользователя, при необходимости.
* пароль пользователя, при необходимости.
К примеру, отправляем POST запрос скрипту ajax.php:
JavaScript:
var request = new ajaxRequest();
request.open('POST', 'ajax.php', true);
== Обработчик ответа ==
По мере обработки запроса сервером, он будет оповещать браузер о состоянии (инициализация, процесс обработки, готово...). При этом браузер каждый раз передает в JavaScript эту информацию. Давайте взглянем:
JavaScript:
var request = new ajaxRequest();
request.open('POST', 'ajax.php', true);
//цепляем обработчик
request.onreadystatechange = function() {
//состояние "готово" и статус "OK"
if(request.readyState == 4 && request.status == 200) {
var answer = request.responseText;
//обработка полученных данных
}
}
== Отправка данных ==
Для отправки данных серверу используется метод send(). Для GET запросов можно в качестве параметра указать null. Строго говоря для IE это обязательное требование, но мы же не знаем, какой браузер будет у пользователя, поэтому для отправки пустых данных всегда используйте параметр null.
JavaScript:
var param = 'login=' + encodeURI(input_login) + '&pass=' + encodeURI(input_pass);
var request = new ajaxRequest();
request.open('POST', 'ajax.php', true);
request.onreadystatechange = updatePage;
request.send(param);
Вот и вся основная идея работы с XMLHttpRequest.
=== Библиотека jQuery ===
На мой взгляд, jQuery - одна из наиболее распространенных JavaScript библиотек. И конечно же в рамках этой библиотеки есть реализация AJAX запросов к серверу.
Тут я приведу только общий пример AJAX запроса, а комментарии к коду и описанная идея должны дополнить картину:
JavaScript:
$.ajax({
type: 'POST', //тип запроса
url: 'ajax.php', //адрес скрипта-обработчика на сервере
data: {login: input_login, pass: input_pass}, //передаваемые данные
dataType: 'json' //ответ в формате JSON
}).done(function(answer) {
//обработка ответа от сервера
});
В реализации jQuery вам не нужно думать о том какой браузер запускает AJAX, да и данные передать гораздо проще (меньше писать). Кстати в jQuery есть еще реализации $.get и $.post, которые работают аналогично $.ajax, толко уже сразу подразумевается какой тип запроса будет отправлен - GET или POST.
==== Код на стороне сервера (PHP) ====
По большому счету код на стороне сервера останется тем же, что и при отправке обычного запроса, только вот в качестве ответа будет не страница целиком, а лишь нужные нам данные. Кстати можно вообще вернуть чистые данные в виде json, к примеру, а уже потом в JavaScript обернуть их в HTML. Подобный подход может существенно разгрузить сервер, однако нагрузка на операционную систему пользователя возрастет.
Серверный код я буду рассматривать на языке PHP - для меня он ближе, но вы должны пониать, что в качестве серверного языка вы в праве выбрать любой удобный вам. Так же я рассмотрю случай возвращения данных в виде JSON.
PHP:
$login = !empty($_POST['login']) ? $_POST['login'] : '';
$pass = !empty($_POST['pass']) ? $_POST['pass'] : '';
if(!empty($login) && !empty($pass)) {
if($login == 'login' && $pass == 'password') {
$result = array(
'status' => 'done',
'message' => 'Привет, как дела?'
);
}
else {
$result = array(
'status' => 'error',
'message' => 'Неверный логин или пароль!'
);
}
}
else {
$result = array(
'status' => 'error',
'message' => 'Укажите логин и пароль!'
);
}
echo json_encode($result);
JavaScript обработчик может выглядить так:
JavaScript:
$.ajax({
type: 'POST',
url: 'ajax.php',
data: {login: input_login, pass: input_pass},
dataType: 'json'
}).done(function(answer) {
if(answer.status == 'done') {
alert(answer.message);
}
else if(answer.status == 'error') {
console.log('ERROR: ' + answer.message);
}
});