Создание объекта XMLHTTPRequest
Очень часто для создания объекта XMLHTTPRequest используется схема с использованием структуры try … catch из-за того, что в разных браузерах этот объект создаётся по разному. В Internet Explorer объект XMLHTTPRequest создаётся при помощи ActiveX, в то время как другие браузеры используют собственный объект XMLHTTPRequest. Схема, о которой я говорю представена ниже:
function getXMLHTTPRequest() {
try {
req = new XMLHttpRequest();
} catch(err1) {
try {
req = new ActiveXObject("Msxml2.XMLHTTP");
} catch (err2) {
try {
req = new ActiveXObject("Microsoft.XMLHTTP");
} catch (err3) {
req = false;
}
}
}
return req;
}Такой метод создания имеет недостаток - функция каждый раз при отправке AJAX запроса проверяет наличие объекта XMLHTTPRequest либо объектов ActiveX, что сказывается на производительности. В этом случае оптимизировать создание объекта можно при помощи замыканий (closures). Таким образом приходим к следующему коду:
var getXMLHTTPRequest = (function(){
// массив функций
var XMLHttpFactories = [
function () {return new ActiveXObject("Microsoft.XMLHTTP")},
function () {return new ActiveXObject("Msxml2.XMLHTTP")},
function () {return new ActiveXObject("Msxml3.XMLHTTP")},
function () {return new XMLHttpRequest()}
];
var xmlhttp = null;
for (var i=XMLHttpFactories.length-1; i>=0; i--) {
try {
xmlhttp = XMLHttpFactories[i]();
}
catch (e) {
continue;
}
return XMLHttpFactories[i];
}
})();Здесь, функция getXMLHTTPRequest инициализируется одной из функций, содержащийся в массиве XMLHttpFactories. В итоге тело функции getXMLHTTPRequest в браузере Firefox будет иметь следующий вид:
{return new XMLHttpRequest()}
Все просто, блок try … catch выполнится только один раз - при инициализации функции.
Еще один замечательный метод придумал Дастин Диаз (Dustin Diaz), его статью можно найти здесь. Суть та же, но решена она без использования замыканий:
var getXHR = function() {
var http;
try {
http = new XMLHttpRequest;
getXHR = function() {
return new XMLHttpRequest;
};
} catch(e) {
var msxml = [
"MSXML2.XMLHTTP.3.0",
"MSXML2.XMLHTTP",
"Microsoft.XMLHTTP"
];
for (var i=0, len = msxml.length; i < len; ++i) {
try {
http = new ActiveXObject(msxml[i]);
getXHR = function() {
return new ActiveXObject(msxml[i]);
};
break;
} catch(e) {}
}
}
};Здесь функция getXHR выполнит проверку только при первом вызове, во время которого она будет переназначена в зависимости от того, какой объект имеется в наличии.
Еще хочу обратить ваше внимание на функцию создания объекта XMLHTTP в библиотеке jQuery:
var xml = window.ActiveXObject ? new ActiveXObject("Microsoft.XMLHTTP") : new XMLHttpRequest();Это самый простой способ создания объекта из всех, виденных мной. Джон Ресиг, автор этого кода, утверждает, что различные методы создания ActiveX объектов, как то MSXML2.XMLHTTP.3.0, MSXML2.XMLHTTP и Microsoft.XMLHTTP не сильно различаются между собой, поэтому используется доступный для всех версий IE метод Microsoft.XMLHTTP, что значительно сокращает код. Поэтому, если нет особых требований к производительности функции, я бы порекомендовал использовать именно этот метод.
5 марта 2008 в 20:43
IE 6.0
строка `return new ActiveXObject(”Microsoft.XMLHTTP”);`как и`return new ActiveXObject(”Msxml2.XMLHTTP”);`
вызывают `ошибку на странице` сценария. в Opera все работает, но там то запрос другой, подскажете где искать решение проблемы
5 марта 2008 в 22:52
Это может быть из-за настроек безопасности в IE. XMLHttpRequest в IE реализован так, что если в настройках безопасности отключены доверенные элементы управления ActiveX, то использовать XMLHTTP не получится даже если JavaScript включен.
Еще может быть проблема из-за установки MSXML. Пробуйте создавать объект при помощи второго или третьего варианта функций, где перебираются различные типы объектов (можно в список добавить MSXML2.XMLHTTP.3.0, MSXML2.XMLHTTP.4.0 и т.д.):
var XMLHttpFactories = [
function () {return new ActiveXObject(”Microsoft.XMLHTTP”)},
function () {return new ActiveXObject(”Msxml2.XMLHTTP”)},
function () {return new ActiveXObject(”Msxml3.XMLHTTP”)},
function () {return new ActiveXObject(”MSXML2.XMLHTTP.3.0″)},
function () {return new XMLHttpRequest()}
];
…..
Больше можно узнать на msdn: http://msdn2.microsoft.com/en-us/library/ms537505.aspx (англ.)
6 марта 2008 в 20:32
спасибо, уже разобрался. Просто когда коментировал эти строки ошибка пропадала, правда и код невыполнялся. Счтиал что из-за этого, оказалось проблема в абсолютном адресе в xmlHttp.open(), по которому отправлял, поставил относительный все заработало.