La forma más sencilla de recuperar XmlHttpRequest entre navegadores

¿Cuál es la forma más fácil y segura de recuperar el objeto XmlHttpRequest que funciona en todos los navegadores? Sin ninguna biblioteca extra ¿Hay algún fragmento de código que uses a menudo?

PD: Sé que hay muchos ejemplos en la red, pero esta es precisamente la razón por la que estoy preguntando: hay demasiados ejemplos diferentes, y solo quiero que algo simple y comprobado funcione.

jQuery y otras bibliotecas NO son una opción. ¿Por qué jquery pierde memoria tan mal?

Si bien recomendaría utilizar una biblioteca completa para facilitar el uso, hacer solicitudes AJAX puede ser bastante simple en los navegadores modernos:

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(); 

El siguiente fragmento es un fragmento más avanzado basado en un fragmento de quirksmode.org e incluso es compatible con navegadores muy antiguos (anteriores a 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 

Según lo solicitado, simple y probado para trabajar :

 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; } 

Al colapsarlo en una sola línea, obtenemos:

 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; } 

no está 100% seguro de su pregunta, pero si está solicitando una función para devolver una instancia de XMLHTTP de navegador cruzado, hemos utilizado esto en nuestra biblioteca ajax nativa durante años, y nunca es un problema en ningún navegador

 function getXMLHTTP() { var alerted; var xmlhttp; /*@cc_on @*/ /*@if (@_jscript_version >= 5) // JScript gives us Conditional comstacktion, 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  

Una forma más simple:

Detectar 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; } 

Diferenciar XMLhttp y 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 } 

El ejemplo completo se puede encontrar aquí