Кроссбраузерный XMLHttpRequest
var XMLHttpRequest = XMLHttpRequest || window.ActiveXObject && function() { return new ActiveXObject('Msxml2.XMLHTTP'); };
Теперь мы можем смело писать, например, синхронную загрузку станицы, работающую во всех браузерах
var xhr = new XMLHttpRequest();
xhr.open('get', '/', false);
xhr.send(null);
alert(xhr.responseText);
Или асинхронную
var xhr = new XMLHttpRequest();
xhr.open('get', '/', true);
(function() {
if (xhr.readyState == 4)
alert(xhr.responseText);
else
setTimeout(arguments.callee, 10);
})();
xhr.send(null);
|
Почему не Microsoft.XMLHTTP?
|
Да я не знаю точно, где какой. У меня в ИЕ6 оба работают. По хорошему нужно оба в try-catch завернуть.
|
Похоже каждый создает xhr-объект так, как ему хочется :D
jQuery 1.3.2
xhr:function(){
return window.ActiveXObject ? new ActiveXObject("Microsoft.XMLHTTP") : new XMLHttpRequest();
},
MooTools 1.2.1
Browser.Request = function(){
return $try(function(){
return new XMLHttpRequest();
}, function(){
return new ActiveXObject('MSXML2.XMLHTTP');
});
};
Prototype 1.6.0.2
getTransport: function() {
return Try.these(
function() {return new XMLHttpRequest()},
function() {return new ActiveXObject('Msxml2.XMLHTTP')},
function() {return new ActiveXObject('Microsoft.XMLHTTP')}
) || false;
},
Ext JS 2.2 activeX:[ 'MSXML2.XMLHTTP.3.0', 'MSXML2.XMLHTTP', 'Microsoft.XMLHTTP' ] Fleegixjs var t = [ 'Msxml2.XMLHTTP.6.0', 'MSXML2.XMLHTTP.3.0', 'Microsoft.XMLHTTP' ]; JavaScriptMVC 1.5.2
MVC.Ajax.factory = function(){ return window.ActiveXObject ? new ActiveXObject("Microsoft.XMLHTTP") : new XMLHttpRequest();};
AJAX.OOP 1.0.4
this._transport = (new XMLHttpRequest() || new ActiveXObject('Msxml2.XMLHTTP') || new ActiveXObject('Microsoft.XMLHTTP') || null);
June 1.1
var createXmlHttp = function()
{
///<summary>Creates an XMLHttpRequest object.</summary>
///<returns type="Object" />
try { return new XMLHttpRequest(); } catch(ex){}
try { return new ActiveXObject("Msxml2.XMLHTTP"); } catch(ex){}
try { return new ActiveXObject("Microsoft.XMLHTTP"); } catch(ex) {
return xmlHttpNotImplemented();
}
return null;
};
Midori (r80)
try { this.request = new XMLHttpRequest() }
catch (e)
{ try { this.request = new ActiveXObject('Msxml2.XMLHTTP') }
catch (e)
{ this.request = new ActiveXObject('Microsoft.XMLHTTP') }
}
DOMAssistant 2.7.4 var XMLHttpMS = ["Msxml2.XMLHTTP.6.0", "Msxml2.XMLHTTP.3.0", "Msxml2.XMLHTTP", "Microsoft.XMLHTTP"]; Dojo d._XMLHTTP_PROGIDS = ['Msxml2.XMLHTTP', 'Microsoft.XMLHTTP', 'Msxml2.XMLHTTP.4.0']; |
Цитата:
Моя абстракция круче :) |
Мне такой вариант нравится:
if (!XMLHttpRequest) var XMLHttpRequest = function() {
for (var progIDs = ['Msxml2.XMLHTTP.3.0', 'Msxml2.XMLHTTP', 'Microsoft.XMLHTTP'],
i = 0, length = progIDs.length; i < length; i++) try {
return new ActiveXObject(progIDs[i]);
} catch (err) {}
return null;
};
вроде работает. |
Цитата:
|
В MSDN вообще примеры с использованием MSXML2.XMLHTTP.3.0.
В вот на англоязычном форуме какой-то многозвездочный юзер A1ien51 отвечает: Цитата:
|
Вообще, мой вариант почти без изменений списан с MicrosoftAjaxLibrary. Уж они сами-то точно знают, что нужно для их браузера.
Вот их вариант (Microsoft.XMLHTTP вообще нет):
if (!window.XMLHttpRequest) {
window.XMLHttpRequest = function window$XMLHttpRequest() {
var progIDs = [ 'Msxml2.XMLHTTP.3.0', 'Msxml2.XMLHTTP' ];
for (var i = 0, l = progIDs.length; i < l; i++) {
try {
return new ActiveXObject(progIDs[i]);
}
catch (ex) {
}
}
return null;
}
}
|
Цитата:
|
| Часовой пояс GMT +3, время: 10:22. |