Прежде чем с объектом XMLHttp можно будет работать, его, понятное дело, надо создать. Microsoft реализовала объект в виде элемента управления ActiveX, поэтому в JavaScript приходится использовать
проприетарный класс ActiveXObject, указывая сигнатуру элемента управления XMLHttp:
var oXntlHttp = new ActiveXObject("Microsoft.XMLHttp");
Эта строка создает объект XMLHttp первой версии (распространялась с броузером IE 5.0). Но дело в том, что существуют более новые версии объекта, появлявшиеся в каждой последующей версии библиотеки
MSXML. Каждая новая версия обладала более высокой стабильностью и быстродействием, поэтому мысль о том, что лучше работать с одной из самых последних версий, имеющихся на машине пользователя, наверняка покажется вам привлекательной. Возможные сигнатуры перечислены
ниже:
• Microsoft.XMLHttp
• MSXML2.XMLHttp
• MSXML2.XMLHttp.3.0
• MSXML2.XMLHttp.4.0
• MSXML2.XMLHttp.5.0
К сожалению, единственный способ выбрать наилучшую версию заключается в том, чтобы попытаться создавать их по очереди. Поскольку это все-таки элемент управления ActiveX, любая ошибка созданиа объекта будет возбуждать исключительную ситуацию, а это означает, что попытки создания объекта необходимо предпринимать внутри конструкции try...catch. В результате функция создания объекта можетвыглядеть так:
function createXMLHttp(){
var aversions = ["MSXML2.XMLHttp.5.0","MSXML2.XMLHttp.4.0",
"MSXML2.XMLHttp.3.0","HSXML2.XMLHttp",
"Microsoft.XMLHttp"
];
for (var i = 0; i < aversions.length; i++) {
try {
var oXmlHttp = new ActiveXObject(aVersions[i});
return oXmlHttp;
} catch (oError) {
// ничего не делать
}
}
throw new Error("He установлена библиотека MSXML.");
}
Функция createXMLHttp() хранит сигнатуры объекта XMLHttp в виде массива,
при этом чем новее версия, тем ближе к началу массива расположена ее сигнатура. Функция обходит в цикле все сигнатуры и пытается создать объект XMLHttp, соответствующий каждой из них. Если попытка
терпит неудачу, управление передается в блок catch, что предотвращает остановку исполнения кода JavaScript из-за ошибки, и затем предпринимается новая попытка со следующей сигнатурой. Если объект удалось создать, он возвращается. Если функции вообще не удалось создать объект XMLHttp, она возбуждает исключение, чтобы проинформировать приложение о неудаче.
В других броузерах создание объекта XMLHttp осуществляется гораздо проще. И в Mozilla Firefox, и в Opera, и в Safari этим занимается один и тот же код:
var oXmlHttp = new XMLHttpRequest();
Это облегчает выработку решения по созданию объекта XMLHttp, не зависящего от типа броузера. Такую функцию можно создать, внеся следующие изменения в функцию createXMLHttp(), описанную выше:
function createXMLHttp() {
if (typeof XMLHttpRequest != "undefined") {
return new XMLHttpRequest();
} else if (window.ActiveXObject) {
var aversions = ["MSXML2.XMLHttp.5.0","MSXML2.XMLHttp.4.0",
"MSXML2.XMLHttp.3.0","MSXML2.XMLHttp",
"Microsoft.XMLHttp"
] ;
for (var i = 0; i < aversions.length; i++) <
try {
var oXmlHttp = new ActiveXObject(aVersions[i]);
return oXmlHttp;
} catch (oError) {
// ничего не делать
}
}
}
throw new Error("Невозможно создать объект XMLHttp.");
}
Теперь эта функция сначала выясняет, определен ли класс XMLHttpRequest(с помощью оператора typeof). Если класс XMLHttpRequest определен,то он используется для создания объекта XMLHttp; в противном случае проверяется существование класса ActiveXObject и, если он существует, выполняются действия по созданию объекта XMLHttp в IE.Если же обе эти попытки потерпели неудачу, возбуждается исключение.
Вот еще один способ создания объектов XMLHttp, не зависящий от типа броузера: можно взять библиотеку, уже включающую в себя весь необходимый код, учитывающий различия между броузерами. В качестве
примера назовем библиотеку zXml, написанную двумя авторами этой книги. Библиотеку можно скачать с сайта www.nczonline.net/downloads/.
В ней имеется функция для создания объектов XMLHttp:
var oXmlHttp = zXmlHttp.createRequest();
И функция createRequest(), и сама библиотека zXml в этой книге используются для устранения проблем совместимости кода с разными типами броузеров.