Объект XMLHTTPRequest - низкоуровневая основа большинства AJAX-приложений. Знание его методов, свойств и особенностей не только помогает писать приложения на низком уровне с минимумом javascript-кода, но и позволяет понять, что происходит внутри фреймворков, которые, увы, часто несовершенны или тянут много лишнего.
Основные методы для посылки запросов XMLHttpRequest.
>> open(Method, Url, async)
>> send(data)
>> onreadystatechange
Правильная последовательность open/onreadystatechange/send:
req.open("GET", url, true)
req.onreadystatechange = handler
req.send(null)Методы для манипуляции заголовками:
>> setRequestHeader()
>> getResponseHeader()
>> getAllResponseHeaders()
Обрыв соединения осуществляет метод
>> abort()
Ответ сервера находится в
>> responseText
>> responseXML
>> status
>> statusText
Причем responseXML заполняется только в случае, когда Content-Type с сервера имеет значение text/xml (кроме overrideMimeType-метода, но он есть только в Firefox).
Краткая сводка плюсов и минусов
>> Возможна синхронная передача (хотя и подвешивает браузер)
>> Полный контроль над заголовками
>> Можно отсылать документы из браузера в виде файлов, составляя POST-запрос вручную
>> В явном виде выдает ошибки коммуникации
>> Ограничение безопасности при помощи same origin policy
>> Невозможна отправка файлов, выбранных в форме
>> Утечки памяти при неправильном применении в старых IE
Пример небольшой функции getUrl, которая делает запросы:
function getXmlHttp()
{
try
{
return new ActiveXObject("Msxml2.XMLHTTP");
}
catch (e)
{
try
{
return new ActiveXObject("Microsoft.XMLHTTP");
}
catch (ee)
{
}
}
if (typeof XMLHttpRequest!='undefined')
{
return new XMLHttpRequest();
}
}
// Получить данные с url и вызывать cb - коллбэк c ответом сервера
function getUrl(http://javascript.ru/forum/url, cb)
{
// IE кэширует XMLHttpRequest запросы, так что добавляем случайный параметр к URL
// (хотя можно обойтись правильными заголовками на сервере)
xmlhttp.open("GET", url+'?r='+Math.random());
xmlhttp.onreadystatechange = function()
{
if (xmlhttp.readyState == 4)
{
cb(
xmlhttp.status,
xmlhttp.getAllResponseHeaders(),
xmlhttp.responseText
);
}
}
xmlhttp.send(null);
}Теги: AJAX
