所有现代浏览器(IE7+、Firefox、Chrome、Safari 以及 Opera)均支持 XMLHttpRequest 对象。
语法:var xhr = new XMLHttpRequest();
IE浏览器中XMLHttpRequest对象是作为ActiveX控件实现的。
IE5和IE6语法:
xhr = new ActiveXObject("Microsoft.XMLHTTP");
或 xhr = new ActionXObject("Msxm12.XMLHTTP");
即:
function createXHR(){
var xhr = null;
if(window.XMLHttpRequest){
xhr = new XMLHttpRequest();
}else{
if(window.ActiveXObject){
try{
xhr = new ActionXObject("Msxm12.XMLHTTP");
}catch(e){
try{
xhr = new ActiveXObject("Microsoft.XMLHTTP");
}catch(e){
xhr = null;
}
}
}
}
return xhr;
}
以上方法提供的XMLHttpRequest对象创建方法,解决了不同浏览器的差异,而且也处理了不同版本IE浏览器之间的差别,所以可以作为创建XMLHttpRequest对象的通用方法。
但是有一个弊端,就是用户如果多次创建XMLHttpRequest对象,每次调用createXHR方法都会进行复杂的判断,所以我们需要使用惰性函数,即当方法执行之后,已经判断出浏览器的执行环境,然后让createXHR重新赋值,赋值后的函数是直接return 对应的方法。
function createXHR(){
var xhr = null,flag = false,
ary = [
function(){
return new XMLHttpRequest;
},
function(){
return new ActiveObject("Microsoft.XMLHTTP");
},
function(){
return new ActiveObject("Msxml2.XMLHTTP");
}
];
for(var i=0,len=ary.length;i<len;i++){
var curFn = ary[i];
try{
xhr = curFn();
//本次循环未出错,浏览器兼容这个版本,把createXHR重写为当前方法,完成后不需要判断下面的,直接退出循环即可
createXHR = curFn;
flag = true;
break;
}catch(e){
//本次循环获取的方法执行出现错误,继续执行下一次循环
}
}
if(!flag){
throw new Error("error");
}
return xhr;
}