具有简化的跨浏览器XMLHttpRequest

时间:2014-05-01 16:23:01

标签: javascript ajax xmlhttprequest

三个问题:

XHR的MDN文档中,第3步 - 一个简单的示例,为什么他们编写代码的方式是通过一个引用每个XMLHttpRequest全局变量:httpRequest?它是否解决了一些奇怪的浏览器不一致问题?

另外,您是否认为这是创建XMLHttpRequest的更惯用和简洁的方式:

<script type = 'text/javascript' language = 'Javascript' charset = 'utf-8'>

var httpRequest;
var sendStuff = function(url,method) {  
if (!method) {var method = 'POST'}
if (!url) {return}

httpRequest = (function() { // self executing anonymous function
  try {        
    return new XMLHttpRequest() || ActiveXObject('Msxml2.XMLHTTP.6.0') 
    || ActiveXObject('Msxml2.XMLHTTP.3.0') || ActiveXObject('Microsoft.XMLHTTP');

    /* equivalent to returning a new instance of XHR OR if false ActiveX 6.0 OR 
       if false ActiveX 3.0 OR if false XMLHTTP, depending on browser support */
  } 
  catch(e) { return } // handle errors: if no support
})();
</script>

修改:显然,(function(){})()事情在同行评审时似乎没有必要。只需使用httpRequest = a || b || c || d || false;

Edit2 :不幸的是,如果ActiveX被禁用,IE显然会抛出错误,所以坚持使用try-catch

<script>

if (httpRequest) {
httpRequest.open(method,url);
httpRequest.send(null);
httpRequest.onreadystatechange = function() {
    if (httpRequest.readyState === 4) {
        alert(httpRequest.responseText);        
    }   
};
} 
else { 
if (document.getElementById) {
    document.getElementById('fallback').innerHTML = 'No XHR support!'
} else { alert('Jeez - time for an upgrade, dude!'); }
}

}; // end sendStuff

</script>

似乎只要每个人都理解语法,就会更容易理解这种方式。这对你来说是真的吗?

最后,ActiveXObject('Microsoft.XMLHTTP')是否优先于其他IE XHR,还是应该优先使用Msxml2.XMLHTTP.6.0

备注:如果您正在使用XAMPP / localhost,则处于保护模式的IE可能会阻止您的脚本首先运行。您必须在受保护模式下检查enable scripts以在那里测试XHR。

我研究了一些,并希望在任何人浪费时间尝试该程序之前发布我自己的答案,但实际上我不能直到明天,所以它就在这里 - &gt;

问题一:使用全局变量XHR将同时的Ajax请求限制为只有一个,实际上,因为前一个XHR会被覆盖。这可能是有用的效果,但并非总是如此。如果要允许并发请求,请使用局部变量,但确切的数字因浏览器而异。

问题三:已经回答。

问题二:不幸的是,一旦浏览器达到它无法识别的功能,使用OR运算符仍会抛出错误。例如:

var testIng = fakeFunction() || otherFakeFunction() || true; 
console.log(testIng);

// Uncaught Reference Error for fakeFunction()

因此,虽然使用||可能更简洁,但它是以应用程序为代价的。但是,这没有例外:

var testIng = (function() {
try {
    return new fakeFunction();  
} 
catch (e) {
    return true;
}
})();

console.log(testIng); // true

1 个答案:

答案 0 :(得分:0)

该变量只是全局变量,因为整个脚本在全局上下文中运行。

使用它是因为您需要使用对象的实例,而不是原始构造函数。

在自动执行的匿名函数中包装创建该实例的代码毫无意义。没有创建任何未返回到全局范围的变量。


  

ActiveXObject('Microsoft.XMLHTTP')是否优先于其他IE XHR

  

或是否应该优先使用Msxml2.XMLHTTP.6.0?

IE7以来一直支持Native XMLHttpRequest。我已经放弃担心IE早于IE 8,所以我根本不会回归到ActiveX。 (您的里程和目标受众可能会有所不同)。