Самый простой способ получить кросс-браузер XmlHttpRequest

Какой самый простой и безопасный способ получить объект XmlHttpRequest, который работает во всех браузерах? Без каких-либо дополнительных библиотек. Есть ли fragment кода, который вы часто используете?

PS Я знаю, что в сети много примеров, но именно по этой причине я спрашиваю: слишком много разных примеров, и я просто хочу что-то простое и доказанное для работы.

jQuery и другие библиотеки НЕ являются опцией. Почему у jquery утечка памяти так плохо?

Хотя я бы рекомендовал использовать полную библиотеку для упрощения использования, что делает запросы AJAX довольно простыми в современных браузерах:

var req = new XMLHttpRequest(); req.onreadystatechange = function(){ if(this.readyState == 4){ alert('Status code: ' + this.status); // The response content is in this.responseText } } req.open('GET', '/some-url', true); req.send(); 

Следующий fragment представляет собой более продвинутый fragment, основанный на fragmentе от quirksmode.org и даже поддерживающий очень старые браузеры (старше Internet Explorer 7):

 function sendRequest(url,callback,postData) { var req = createXMLHTTPObject(); if (!req) return; var method = (postData) ? "POST" : "GET"; req.open(method,url,true); // Setting the user agent is not allowed in most modern browsers It was // a requirement for some Internet Explorer versions a long time ago. // There is no need for this header if you use Internet Explorer 7 or // above (or any other browser) // req.setRequestHeader('User-Agent','XMLHTTP/1.0'); if (postData) req.setRequestHeader('Content-type','application/x-www-form-urlencoded'); req.onreadystatechange = function () { if (req.readyState != 4) return; if (req.status != 200 && req.status != 304) { // alert('HTTP error ' + req.status); return; } callback(req); } if (req.readyState == 4) return; req.send(postData); } var XMLHttpFactories = [ function () {return new XMLHttpRequest()}, function () {return new ActiveXObject("Msxml3.XMLHTTP")}, function () {return new ActiveXObject("Msxml2.XMLHTTP.6.0")}, function () {return new ActiveXObject("Msxml2.XMLHTTP.3.0")}, function () {return new ActiveXObject("Msxml2.XMLHTTP")}, function () {return new ActiveXObject("Microsoft.XMLHTTP")} ]; function createXMLHTTPObject() { var xmlhttp = false; for (var i=0;i 

По просьбе прост и доказал свою эффективность :

 function Xhr(){ /* returns cross-browser XMLHttpRequest, or null if unable */ try { return new XMLHttpRequest(); }catch(e){} try { return new ActiveXObject("Msxml3.XMLHTTP"); }catch(e){} try { return new ActiveXObject("Msxml2.XMLHTTP.6.0"); }catch(e){} try { return new ActiveXObject("Msxml2.XMLHTTP.3.0"); }catch(e){} try { return new ActiveXObject("Msxml2.XMLHTTP"); }catch(e){} try { return new ActiveXObject("Microsoft.XMLHTTP"); }catch(e){} return null; } 

Свернув его в одну строку, мы получаем:

 function Xhr(){ try{return new XMLHttpRequest();}catch(e){}try{return new ActiveXObject("Msxml3.XMLHTTP");}catch(e){}try{return new ActiveXObject("Msxml2.XMLHTTP.6.0");}catch(e){}try{return new ActiveXObject("Msxml2.XMLHTTP.3.0");}catch(e){}try{return new ActiveXObject("Msxml2.XMLHTTP");}catch(e){}try{return new ActiveXObject("Microsoft.XMLHTTP");}catch(e){}return null; } 

не 100% определенного вопроса, но если вы просите функцию вернуть экземпляр XMLHTTP с перекрестным браузером, мы использовали это в нашей собственной библиотеке ajax в течение многих лет – и никогда не проблема в любом браузере

 function getXMLHTTP() { var alerted; var xmlhttp; /*@cc_on @*/ /*@if (@_jscript_version >= 5) // JScript gives us Conditional compilation, we can cope with old IE versions. try { xmlhttp=new ActiveXObject("Msxml2.XMLHTTP") } catch (e) { try { xmlhttp=new ActiveXObject("Microsoft.XMLHTTP") } catch (E) { alert("You must have Microsofts XML parsers available") } } @else alert("You must have JScript version 5 or above.") xmlhttp=false alerted=true @end @*/ if (!xmlhttp && !alerted) { // Non ECMAScript Ed. 3 will error here (IE<5 ok), nothing I can // realistically do about it, blame the w3c or ECMA for not // having a working versioning capability in  

Простейший способ:

Обнаружить IE:

 function detectIE() { var ua = window.navigator.userAgent, msie = ua.indexOf('MSIE '), trident = ua.indexOf('Trident/'), edge = ua.indexOf('Edge/'); if (msie > 0) {return parseInt(ua.substring(msie + 5, ua.indexOf('.', msie)), 10);} if (trident > 0) {var rv = ua.indexOf('rv:');return parseInt(ua.substring(rv + 3, ua.indexOf('.', rv)), 10);} if (edge > 0) {return parseInt(ua.substring(edge + 5, ua.indexOf('.', edge)), 10);} return false; } 

Различать XMLhttp и XDomain:

 var url = "https://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20weather.forecast%20where%20woeid%20in%20(select%20woeid%20from%20geo.places(1)%20where%20text%3D%27pune%2Cmh%27)&format=json&env=store%3A%2F%2Fdatatables.org%2Falltableswithke" if (window.XDomainRequest && detectIE()) { var xdr = new XDomainRequest(); xdr.open("GET", url, false); xdr.onload = function () { var res = JSON.parse(xdr.responseText); if (res == null || typeof (res) == 'undefined') { res = JSON.parse(data.firstChild.textContent); } publishData(res); }; xdr.send(); } else { var xmlhttp = new XMLHttpRequest(); xmlhttp.onreadystatechange = function() { if (xmlhttp.readyState == 4) { if (xmlhttp.status == 200 || xmlhttp.status == 304) { publishData(JSON.parse(xmlhttp.responseText)); } else { setTimeout(function(){ console.log("Request failed!") }, 0); } } } xmlhttp.open("GET", url, true); xmlhttp.send(); } function publishData(data){ console.log(data); //Response } 

Полный пример можно найти здесь

Interesting Posts

Java-коллекция пар ценностей? (кортежи?)

Как я могу отформатировать этот путь для работы в качестве значения ключа реестра?

Нужно ли назначать строку переменной перед ее сопоставлением с другим?

Как сделать текст доски более понятным с помощью MATLAB?

Как я могу форматировать диск с использованием формата GPT в OS X?

Как сделать вызов веб-службы SOAP из classа Java?

Точки пересечения окружности

Где я могу скачать windows vista на законных основаниях?

Apache Commons Codec с Android: не удалось найти метод

Почему веб-службы ASP.NET JSON возвращают результат в ‘d’?

Будет ли Windows 10 «Сбросить мой компьютер» с файлом «Keep Files» оставить D: \ в одиночку?

Почему тройной оператор неожиданно накладывает целые числа?

Является ли groupByKey когда-либо предпочтительнее overByKey

Android – создайте отдельные APK для разных процессорных архитектур

Связь между важными и спецификациями CSS

Давайте будем гением компьютера.