В этой короткой статье рассматриваются базовые принципы построения web-приложения с использоваием технологии AJAX в наиболее простой и надёжной в работе форме.
Согласно http://ru.wikipedia.org/wiki/Ajax:
AJAX (от англ. Asynchronous JavaScript and XML – «асинхронный JavaScript и XML») – это подход к построению интерактивных пользовательских интерфейсов веб-приложений. При использовании AJAX веб-страница не перезагружается полностью в ответ на каждое действие пользователя. Вместо этого с веб-сервера догружаются только нужные пользователю данные. AJAX – один из компонентов концепции DHTML.
AJAX базируется на двух основных принципах:
перезагрузки всей страницы полностью, например:
элемент.
обновления страницы.
перезагрузки страницы).
Часто сервер передаёт не готовый HTML-код, а только данные; а HTML-элементы создаются исходя из этих данных, с использованием методов модификации DOM. При этом в качестве формата передачи данных обычно используются XML или JSON.
JSON хорош тем, что на стороне клиента его не надо обрабатывать каким-то специальным образом, достаточно выполнить вызов функции eval(). Однако, исходя из соображений безопасности, его необходимо анализировать, так как при передаче вредоносного кода функция eval() выполнит данный код.
Идеология «загрузки страницы по частям» мягко говоря не нова и до этого прекрасно реализовывалась во фреймах, которые с некоторых пор попали в опалу, по причине того, что поисковики их не любят. AJAX – любим поисковиками ничуть не более чем фреймы, впрочем в нем много того, что есть лишь дань моде и с построением удобных web-интерфейсов не связано. Рассмотрим поподробнее этапы этой модели.
Есть 2 основных способа, использование которых не сулит особых проблем, и слабо отличаются по сложности исполнения: создание дочернего фрейма и использование объекта XMLHttpRequest.
Оба этих способа примерно одинаковы по всем параметрам и позволяют достичь примерно одного результата
Мой выбор 2-го варианта связан, в основном, с причиной «исторически сложилось»
В этом месте обычно разгорается жаркий идеологический спор. Наиболее употребимых и безпроблемным способов передачи данных между сервером и клиентом существует 2: через XML и в виде обычного HTML.
Я как правило использую обычный HTML по следующим причинам:
Рассмотрим пример простого AJAX - приложения, подгружающего в код основной страницы содержимое другой, при клике по ссылке. Причем подгружает его только один раз, дальше он его просто показывает и прячет.
Представлен файлом scripts.js, лежащим в корне сайта
// Код вызова
var call_code;
// Объект класса XMLHttpRequest
var xmlHttp;
function CallServer(item,url,reload)
{
// Если reload - false - то страница загружается в объект только если innerHTML у него пустой
// Запоминаем код вызова
call_code=item;
// Если данных ещё нет, то подгружаем их
if ((call_code!='') &&
((document.getElementById(item).innerHTML=='' || reload))
)
{
// Если имеем дело не с InternetExplorer
if (window.XMLHttpRequest) {
xmlHttp = new XMLHttpRequest();
// Открыть соединение с сервером
xmlHttp.open("GET", url, true);
// Установить функцию для сервера, которая выполнится после его ответа
xmlHttp.onreadystatechange = updatePage;
// SПередать запрос
xmlHttp.send(null);
}
// Если имеем дело с InternetExplorer(он объект XMLHttpRequest имеет
// в виде active-X компонента XMLHTTP)
else if (window.ActiveXObject)
{
xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
// Установить функцию для сервера, которая выполнится после его ответа
xmlHttp.onreadystatechange = updatePage;
// Открыть соединение с сервером
xmlHttp.open("GET", url, true);
// SПередать запрос
xmlHttp.send();
}
// Включить индикатор загрузки
loadPage();
}
}
//индикатор загрузки
function loadPage()
{
document.getElementById(call_code).innerHTML= 'Загрузко...';
}
// Функция, выполняемая после ответа
function updatePage() {
if (xmlHttp.readyState == 4) {
if (xmlHttp.status == 200) {
// Если код ошибки - 200 подгружем ответ сервера в элемент HTML с
// ID=call_code
document.getElementById(call_code).innerHTML = xmlHttp.responseText;
} else {
alert("Не удалось получить данные:\n" + xmlHttp.statusText);
}
}
}
// Функция показывает, скрывает элемент html с указанным ID
function SH(name) {
_div = document.getElementById(name);
if (_div.style.display == "none") _div.style.display=""; else _div.style.display="none";
}
Представлен файлом index.html, лежащим в корне сайта
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<title></title>
<meta http-equiv="Content-Type" content="text/html; charset=Windows-1251">
<script type="text/javascript" src="/scripts.js"></script>
</head>
<body>
<!--
При клике на ссылку в элемент с ID = content подгружется содержимое страницы
loading.php, причем только один раз - когда туда еще ничего не загружено (потому
что 3-й параметр функции CallServer = false)
-->
<a href="#" onclick="SH('content');CallServer('content','/loading.php',false);">Подгрузить</a>
<div id="content" style="display:none"></div>
</body>
</html>
Представлен файлом loading.php, лежащим в корне сайта
<?php
// Выставляем кодировку
header("Content-Type: text/html; charset=Windows-1251");
?>
Hello world
Вот на что следует обратить внимание, тем, кто только знакомится с ajax вообще, и с XMLHttpRequest в частности:
<?php
// Выставляем кодировку
header("Content-Type: text/html; charset=Windows-1251");
?>
Без него в FireFox и Opera будут проблемы с кодировкой, а InternetExplorer вообще откажется с вами работать
Представленный пример (особенно JavaScript-фреймворк) несмотря на свою простоту является законченным строительным блоком, который может использоваться для построения web-приложений с асинхронной загрузкой частей страницы. Надеюсь кому-то это будет полезно