Объект 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