Объект XMLHttpRequest никогда не стандартизировался, и процесс его создания в Internet Explorer отличается от такового в других платформах. (К счастью, прикладной интерфейс для работы с объектом XMLHttpRequest после его создания одинаков для всех платформ.)
В большинстве броузеров объект XMLHttpRequest создается простым вызовом кон_ структора:
var request = new XMLHttpRequest();
В IE до появления версии 7 конструктор XMLHttpRequest() попросту отсутствовал.
В IE 5 и 6 XMLHttpRequest представляет собой объект ActiveX и должен создавать_ ся обращением к конструктору ActiveXObject(), которому передается имя созда_ ваемого объекта:
var request = new ActiveXObject("Msxml2.XMLHTTP");
К сожалению, в разных версиях библиотеки XML HTTP компании Microsoft объект имеет различные имена. В зависимости от версии библиотеки, установ_ ленной у клиента, иногда приходится использовать следующий программный код для создания объекта:
var request = new ActiveXObject("Microsoft.XMLHTTP");
Пример 20.1 представляет собой платформонезависимую вспомогательную функ_ цию с именем HTTP.newRequest(), которая создает объекты XMLHttpRequest.
Пример 20.1. Вспомогательная функция HTTP.newRequest()
// Попробуем использовать следующие функции, создающие объект XMLHttpRequest. HTTP._factories = [
function() { return new XMLHttpRequest(); },
function() { return new ActiveXObject("Msxml2.XMLHTTP"); }, function() { return new ActiveXObject("Microsoft.XMLHTTP"); }
];
// Когда будет обнаружена работоспособная функция, она будет сохранена здесь. HTTP._factory = null;
20.1. Использование объекта XMLHttpRequest
// Создает и возвращает новый объект XMLHttpRequest.
//
// При первом обращении к функции опробываются все функции из списка, пока
// не будет найдена та, что вернет непустое значение и не возбудит исключение.
// После того как будет обнаружена работоспособная функция, ссылка на нее
// запоминается для последующего использования.
//
HTTP.newRequest = function() {
if (HTTP._factory != null) return HTTP._factory();
for(var i = 0; i < HTTP._factories.length; i++) { try {
var factory = HTTP._factories[i]; var request = factory();
if (request != null) { HTTP._factory = factory; return request;
}
}
catch(e) { continue;
}
}
// Если попав сюда, сценарию не удалось обнаружить подходящую функцию для создания
// объекта, необходимо возбудить исключение в этом и всех последующих вызовах. HTTP._factory = function() {
throw new Error("Объект XMLHttpRequest не поддерживается");