三个问题:
在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
答案 0 :(得分:0)
该变量只是全局变量,因为整个脚本在全局上下文中运行。
使用它是因为您需要使用对象的实例,而不是原始构造函数。
在自动执行的匿名函数中包装创建该实例的代码毫无意义。没有创建任何未返回到全局范围的变量。
ActiveXObject('Microsoft.XMLHTTP')是否优先于其他IE XHR
是
或是否应该优先使用Msxml2.XMLHTTP.6.0?
IE7以来一直支持Native XMLHttpRequest。我已经放弃担心IE早于IE 8,所以我根本不会回归到ActiveX。 (您的里程和目标受众可能会有所不同)。