XMLHttpRequest的兼容代码功能结构上大体没有什么变动
主要处理了这么几条:
1.不同浏览器的创建方式
2.事件大小写问题(ie7的XMLHttpRequest)
3.this指向问题(ie6的ActiveX)
4.增加了2个事件onerror和onfinish
部分代码方便阅读:
function HttpRequest()
{
if(this==window)throw new Error(0,"HttpRequest is unable to call as a function.")
var me=this;
var asyncFlag=false;
var typeFlag=false;
var r;
function onreadystatechange()
{
if(me.onreadystatechange)me.onreadystatechange.call(r);
if(r.readyState==4)
{
if(Number(r.status)>=300)
{
if(me.onerror)me.onerror.call(r,new Error(0,"Http error:"+r.status+" "+r.statusText));
if(typeFlag)r.onreadystatechange=Function.prototype;
else r.onReadyStateChange=Function.prototype;
r=null;
return;
}
me.status=r.status;
me.statusText=r.statusText;
me.responseText=r.responseText;
me.responseBody=r.responseBody;
me.responseXML=r.responseXML;
me.readyState=r.readyState;
if(typeFlag)r.onreadystatechange=Function.prototype;
else r.onReadyStateChange=Function.prototype;
r=null;
if(me.onfinish)me.onfinish();
}
}
function creatHttpRequest(){
var e;
try{
r=new window.XMLHttpRequest();
typeFlag=true;
} catch(e) {
var ActiveXName=[
'MSXML2.XMLHttp.6.0',
'MSXML2.XMLHttp.3.0',
'MSXML2.XMLHttp.5.0',
'MSXML2.XMLHttp.4.0',
'Msxml2.XMLHTTP',
'MSXML.XMLHttp',
'Microsoft.XMLHTTP'
]
function XMLHttpActiveX()
{
var e;
for(var i=0;i<ActiveXName.length;i++)
{
try{
var ret=new ActiveXObject(ActiveXName[i]);
typeFlag=false;
} catch(e) {
continue;
}
return ret;
}
throw {"message":"XMLHttp ActiveX Unsurported."};
}
try{
r=new XMLHttpActiveX();
typeFlag=false;
} catch(e) {
throw new Error(0,"XMLHttpRequest Unsurported.");
}
}
}
creatHttpRequest();
this.abort=function(){
r.abort();
}
this.getAllResponseHeaders=function(){
r.getAllResponseHeaders();
}
this.getResponseHeader=function(Header){
r.getResponseHeader(bstrHeader);
}
this.open=function(Method,Url,Async,User,Password){
asyncFlag=Async;
try{
r.open(Method,Url,Async,User,Password);
} catch(e) {
if(me.onerror)me.onerror(e);
else throw e;
}
}
this.send=function(Body){
try{
if(typeFlag)r.onreadystatechange=onreadystatechange;
else r.onReadyStateChange=onreadystatechange;
r.send(Body);
//alert("sended");
if(!asyncFlag){
this.status=r.status;
this.statusText=r.statusText;
this.responseText=r.responseText;
this.responseBody=r.responseBody;
this.responseXML=r.responseXML;
this.readyState=r.readyState;
if(typeFlag)r.onreadystatechange=Function.prototype;
else r.onReadyStateChange=Function.prototype;
r=null;
}
} catch(e) {
if(me.onerror)me.onerror(e);
else throw e;
}
//alert("sended");
}
this.setRequestHeader=function(Name,Value){
r.setRequestHeader(Name,Value);
}
}
请稍等,评论加载中...