一份老外写的XMLHttpRequest代码多浏览器支持兼容性
这几天要构思用Javascript调用Asp.Net的WebService,需要到XMLHTTP来支持,但发现Opera的XMLHttpRequest很烂,实在支持不下去,后来到处找,终于发现这份代码,在Opera中是利用java.net.URL等类来实现的,不敢独享,特发上来与大家同乐。
复制代码代码如下:
/
Cross-BrowserXMLHttpRequestv1.2
=================================
EmulateGecko''XMLHttpRequest()''functionalityinIEandOpera.Operarequires
theSunJavaRuntimeEnvironment.
byAndrewGregory
scss.com.au/family/andrew/webdesign/xmlhttprequest/
ThisworkislicensedundertheCreativeCommonsAttributionLicense.Toviewa
copyofthislicense,visithttp://creativecommons.org/licenses/by-sa/2.5/or
sendalettertoCreativeCommons,559NathanAbbottWay,Stanford,California
94305,USA.
Attribution:Leavemynameandwebaddressinthisscriptintact.
NotSupportedinOpera
----------------------
user/passwordauthentication
responseXMLdatamember
NotFullySupportedinOpera
----------------------------
asyncrequests
abort()
getAllResponseHeaders(),getAllResponseHeader(header)
/
//IEsupport
if(window.ActiveXObject&&!window.XMLHttpRequest){
window.XMLHttpRequest=function(){
varmsxmls=newArray(
''Msxml2.XMLHTTP.5.0'',
''Msxml2.XMLHTTP.4.0'',
''Msxml2.XMLHTTP.3.0'',
''Msxml2.XMLHTTP'',
''Microsoft.XMLHTTP'');
for(vari=0;i try{
returnnewActiveXObject(msxmls[i]);
}catch(e){
}
}
returnnull;
};
}
//Geckosupport
/;-)/
//Operasupport
if(window.opera&&!window.XMLHttpRequest){
window.XMLHttpRequest=function(){
this.readyState=0;//0=uninitialized,1=loading,2=loaded,3=interactive,4=complete
this.status=0;//HTTPstatuscodes
this.statusText='''';
this._headers=[];
this._aborted=false;
this._async=true;
this._defaultCharset=''ISO-8859-1'';
this._getCharset=function(){
varcharset=_defaultCharset;
varcontentType=this.getResponseHeader(''Content-type'').toUpperCase();
val=contentType.indexOf(''CHARSET='');
if(val!=-1){
charset=contentType.substring(val);
}
val=charset.indexOf('';'');
if(val!=-1){
charset=charset.substring(0,val);
}
val=charset.indexOf('','');
if(val!=-1){
charset=charset.substring(0,val);
}
returncharset;
};
this.abort=function(){
this._aborted=true;
};
this.getAllResponseHeaders=function(){
returnthis.getAllResponseHeader('''');
};
this.getAllResponseHeader=function(header){
varret='''';
for(vari=0;i if(header==''''||this._headers[i].h==header){
ret+=this._headers[i].h+'':''+this._headers[i].v+''\n'';
}
}
returnret;
};
this.getResponseHeader=function(header){
varret=getAllResponseHeader(header);
vari=ret.indexOf(''\n'');
if(i!=-1){
ret=ret.substring(0,i);
}
returnret;
};
this.setRequestHeader=function(header,value){
this._headers[this._headers.www.visa158.comlength]={h:header,v:value};
};
this.open=function(method,url,async,user,password){
this.method=method;
this.url=url;
this._async=true;
this._aborted=false;
this._headers=[];
if(arguments.length>=3){
this._async=async;
}
if(arguments.length>3){
opera.postError(''XMLHttpRequest.open()-user/passwordnotsupported'');
}
this.readyState=1;
if(this.onreadystatechange){
this.onreadystatechange();
}
};
this.send=function(data){
if(!navigator.javaEnabled()){
alert("XMLHttpRequest.send()-Javamustbeinstalledandenabled.");
return;
}
if(this._async){
setTimeout(this._sendasync,0,this,data);
//thisisnotreallyasynchronousandwon''texecuteuntilthecurrent
//executioncontextends
}else{
this._sendsync(data);
}
}
this._sendasync=function(req,data){
if(!req._aborted){
req._sendsync(data);
}
};
this._sendsync=function(data){
this.readyState=2;
if(this.onreadystatechange){
this.onreadystatechange();
}
//openconnection
varurl=newjava.www.hunanwang.net.net.URL(newjava.net.URL(window.location.href),this.url);
varconn=url.openConnection();
for(vari=0;i conn.setRequestProperty(this._headers[i].h,this._headers[i].v);
}
this._headers=[];
if(this.method==''POST''){
//POSTdata
conn.setDoOutput(true);
varwr=newjava.io.OutputStreamWriter(conn.getOutputStream(),this._getCharset());
wr.write(data);
wr.flush();
wr.close();
}
//readresponseheaders
//NOTE:thegetHeaderField()methodsalwaysreturnnullsforme:(
vargotContentEncoding=false;
vargotContentLength=false;
vargotContentType=false;
vargotDate=false;
vargotExpiration=false;
vargotLastModified=false;
for(vari=0;;i++){
varhdrName=conn.getHeaderFieldKey(i);
varhdrValue=conn.getHeaderField(i);
if(hdrName==null&&hdrValue==null){
break;
}
if(hdrName!=null){
this._headers[this._headers.length]={h:hdrName,v:hdrValue};
switch(hdrName.toLowerCase()){
case''content-encoding'':gotContentEncoding=true;break;
case''content-length'':gotContentLength=true;break;
case''content-type'':gotContentType=true;break;
case''date'':gotDate=true;break;
case''expires'':gotExpiration=true;break;
case''last-modified'':gotLastModified=true;break;
}
}
}
//trytofillinanymissingheaderinformation
varval;
val=conn.getContentEncoding();
if(val!=null&&!gotContentEncoding)this._headers[this._headers.length]={h:''Content-encoding'',v:val};
val=conn.getContentLength();
if(val!=-1&&!gotContentLength)this._headers[this._headers.length]={h:''Content-length'',v:val};
val=conn.getContentType();
if(val!=null&&!gotContentType)this._headers[this._headers.length]={h:''Content-type'',v:val};
val=conn.getDate();
if(val!=0&&!gotDate)this._headers[this._headers.length]={h:''Date'',v:(newDate(val)).toUTCString()};
val=conn.getExpiration();
if(val!=0&&!gotExpiration)this._headers[this._headers.length]={h:''Expires'',v:(newDate(val)).toUTCString()};
val=conn.getLastModified();
if(val!=0&&!gotLastModified)this._headers[this._headers.length]={h:''Last-modified'',v:(newDate(val)).toUTCString()};
//readresponsedata
varreqdata='''';
varstream=conn.getInputStream();
if(stream){
varreader=newjava.io.BufferedReader(newjava.io.InputStreamReader(stream,this._getCharset()));
varline;
while((line=reader.readLine())!=null){
if(this.readyState==2){
this.readyState=3;
if(this.onreadystatechange){
this.onreadystatechange();
}
}
reqdata+=line+''\n'';
}
reader.close();
this.status=200;
this.statusText=''OK'';
this.responseText=reqdata;
this.readyState=4;
if(this.onreadystatechange){
this.onreadystatechange();
}
if(this.onload){
this.onload();
}
}else{
//error
this.status=404;
this.statusText=''NotFound'';
this.responseText='''';
this.readyState=4;
if(this.onreadystatechange){
this.onreadystatechange();
}
if(this.onerror){
this.onerror();
}
}
};
};
}
//ActiveXObjectemulation
if(!window.ActiveXObject&&window.XMLHttpRequest){
window.ActiveXObject=function(type){
switch(type.toLowerCase()){
case''microsoft.xmlhttp'':
case''msxml2.xmlhttp'':
case''msxml2.xmlhttp.3.0'':
case''msxml2.xmlhttp.4.0'':
case''msxml2.xmlhttp.5.0'':
returnnewXMLHttpRequest();
}
returnnull;
};
}
|
|