Javascript-форум (https://javascript.ru/forum/)
-   Ваши сайты и скрипты (https://javascript.ru/forum/project/)
-   -   Кроссбраузерный XMLHttpRequest (https://javascript.ru/forum/project/4203-krossbrauzernyjj-xmlhttprequest.html)

Kolyaj 01.07.2009 19:59

Кроссбраузерный 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);

Octane 01.07.2009 20:23

Почему не Microsoft.XMLHTTP?

Kolyaj 01.07.2009 20:39

Да я не знаю точно, где какой. У меня в ИЕ6 оба работают. По хорошему нужно оба в try-catch завернуть.

Octane 01.07.2009 21:38

Похоже каждый создает 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'];

Kolyaj 01.07.2009 21:53

Цитата:

Сообщение от Octane
'MSXML2.XMLHTTP.3.0'
'Msxml2.XMLHTTP.6.0'
"Msxml2.XMLHTTP.4.0"

Вот ведь, я и не знал такого :)

Моя абстракция круче :)

Riim 02.07.2009 00:44

Мне такой вариант нравится:
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;
};


вроде работает.

Kolyaj 02.07.2009 09:17

Цитата:

Сообщение от Riim
'Msxml2.XMLHTTP.3.0', 'Msxml2.XMLHTTP', 'Microsoft.XMLHTTP'

Ну если кто-нибудь объяснит чем они отличаются и где работают/не работают, тогда можно и так :)

Octane 02.07.2009 11:21

В MSDN вообще примеры с использованием MSXML2.XMLHTTP.3.0.

В вот на англоязычном форуме какой-то многозвездочный юзер A1ien51 отвечает:
Цитата:

Сообщение от A1ien51
Цитата:

Сообщение от Wukfit
@eric Hi Eric I just wanted to clarify something with you, are you saying that legacy browser support (e.g. IE 5.x) requires the use of both MSXML2.XMLHTTP and Microsoft.XMLHTTP?

Cheers,
Wukfit

Only Microsoft.XMLHTTP is needed and is what I do now.

A good filter would be to use MSXML2 if you do not want the older browsers!

Now in the future browsers, if MS dumps the Microsoft namespace in IE8+, would we need to use the MSXML2 if we expect our site to be along that long? LOL

Eric


Riim 02.07.2009 14:51

Вообще, мой вариант почти без изменений списан с 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;
    }
}

Octane 02.07.2009 14:54

Цитата:

Сообщение от Riim
Уж они сами-то точно знают, что нужно для их браузера.

Хорошо, если так ;)


Часовой пояс GMT +3, время: 18:22.