Более широкие возможности для асинхронного взаимодействия клиентских сценариев с сервером предоставляет объект XMLHttpRequest. Он уже довольно давно поддерживается всеми браузерами, но аббревиатура AJAX появилась относительно недавно, в 2005г. Именно широкое применение в клиентских скриптах объекта XMLHttpRequest обусловило появление специального термина "AJAX" для обозначения соответствующей технологии..
Применение XMLHttpRequest имеет и недостатки:
Важно также помнить, что через XMLHttpRequest можно обращаться лишь к ресурсам, находящимся в том же домене, что и файл, в котором используется данный XMLHttpRequest.
На данном сайте рассматриваются некоторые примеры использования технологии AJAX:
var req; // глобальная переменная для хранения экземпляра объекта XMLHttpRequest
if(window.XMLHttpRequest) { // для всех современных браузеров
req=new XMLHttpRequest();
} else { // для старых IE
try {
req=new ActiveXObject('Msxml2.XMLHTTP');
} catch (e) {
req=new ActiveXObject('Microsoft.XMLHTTP');
}
}
/* Если экземпляр объекта создан,
то назначаем обработчик смены состояния объекта
(в нашем случае - функцию receive):
*/
if (req) req.onreadystatechange = receive;
function loadfile() { // запрос файла news.txt
req.open("get", 'news.txt?'+Math.random(),true);
req.send(null);
}
Функция loadfile() отправляет запрос файла news.txt методом GET, задавая асинхронный режим. Это обеспечивается двумя методами объекта XMLHttpRequest - open() и send().
Метод open() задает параметры запроса, а send() - собственно посылает запрос, добавляя к нему при необходимости указанные в качестве параметра данные.
Поскольку в нашем случае используется метод GET передачи запроса, то данных, указанных в методе send(null), не должно быть (указывается null).
Таким образом, запрос требует от сервера просто вернуть клиенту запрашиваемый файл. При этом содержимое загруженного файла не отображается,
а сохраняется в свойстве responseText объекта XMLHttpRequest.Для периодического вызова функции loadfile() используем метод setInterval():
newsint=setInterval("loadfile()", период_в_мс); // news
if (req) req.onreadystatechange = receive;Структура кода функции receive() может быть такой:
function receive() { // обработчик изменения состояния
if (req.readyState == 4){ // данные загружены
if (req.status == 200) { // HTTP-статус - "OK"
// действия над req.responseText (содержимым загруженного файла)
} else {
// действия в случае неудачи
}
}
Содержимое загруженного текстового файла сохраняется как значение свойства req.responseText. Это может быть обычный текст, HTML-код, JavaScript-код, текст со структурой CSV (табличные данные с символьными разделителями полей). Это содержимое может быть как-то предварительно обработано или оставлено как есть. Возможно, его потребуется отобразить в том или ином виде на странице. Для этого можно использовать свойство innerHTML для заранее созданного элемента, например, <div>.
Как уже отмечалось, на главной странице данного сайта размещен блок, в котором отображаются афоризмы. Собственно афоризмы хранятся в текстовом файле с разделителями (т.е. в так называемом CSV-файле). Указанный файл перезагружается в браузер каждые 15 минут, поскольку я время от времени выкладываю на сервер его обновленную версию. Загруженный файл обрабатывается на стороне клиента: в нем случайным образом раз в 15 секунд выбирается один из афоризмов, который и отображается на странице в отведенном для этой цели блоке.