配色: 字号:
一份老外写的XMLHttpRequest代码多浏览器支持兼容性
2016-10-26 | 阅:  转:  |  分享 
  
一份老外写的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;

};

}





















献花(0)
+1
(本文系白狐一梦首藏)