AJAX——核心XMLHttpRequest对象

 AJAX你们已经都知道了,是为了实现异步通信,提升用户体验度,而将不少旧知识(XML,DOM,JavaScript,HTML,jQuery,Css……)从新融合的一个新的知识框架。而,XMLHttpRequest对象则是其中的重重之中。这篇博客重点总结一下这个对象的使用。固然仍是按照经典的五步法来学习,之后在实践中有更多更好的想法,会拿出来分享的!javascript

 首先,须要先了解这个对象的属性和方法:java

 1 属性  2 说明  3 readyState  4 表示XMLHttpRequest对象的状态:0:未初始化。对象已建立,未调用open;  5 1:open方法成功调用,但Sendf方法未调用;  6 2:send方法已经调用,还没有开始接受数据;  7 3:正在接受数据。Http响应头信息已经接受,但还没有接收完成;  8 4:完成,即响应数据接受完成。  9 Onreadystatechange 10 请求状态改变的事件触发器(readyState变化时会调用这个属性上注册的javascript函数)。 11 responseText 12 服务器响应的文本内容 13 responseXML 14 服务器响应的XML内容对应的DOM对象 15 Status 16 服务器返回的http状态码。200表示“成功”,404表示“未找到”,500表示“服务器内部错误”等。 17 statusText 18 服务器返回状态的文本信息。
 1 方法  2 说明  3 Open(string method,string url,boolean asynch,  4 String username,string password)  5 指定和服务器端交互的HTTP方法,URL地址,即其余请求信息;  6 Method:表示http请求方法,通常使用"GET","POST".  7 url:表示请求的服务器的地址;  8 asynch:表示是否采用异步方法,true为异步,false为同步;  9 后边两个能够不指定,username和password分别表示用户名和密码,提供http认证机制须要的用户名和密码。 10 Send(content) 11 向服务器发出请求,若是采用异步方式,该方法会当即返回。 12 content能够指定为null表示不发送数据,其内容能够是DOM对象,输入流或字符串。 13 SetRequestHeader(String header,String Value) 14 设置HTTP请求中的指定头部header的值为value. 15 此方法需在open方法之后调用,通常在post方式中使用。 16 getAllResponseHeaders() 17 返回包含Http的全部响应头信息,其中相应头包括Content-length,date,uri等内容。 18 返回值是一个字符串,包含全部头信息,其中每一个键名和键值用冒号分开,每一组键之间用CR和LF(回车加换行符)来分隔! 19 getResponseHeader(String header) 20 返回HTTP响应头中指定的键名header对应的值 21 Abort() 22 中止当前http请求。对应的XMLHttpRequest对象会复位到未初始化的状态。

对这个对象有了静态了了解,知道它长的什么样子,有什么功能了,下边该咱们使用它了,固然这里我也用五步法写出代码来:jquery

第一步:建立XMLHttpRuquest对象:ajax

 1 var xmlhttprequest;  2    if(window.XMLHttpRequest){  3        xmlhttprequest=new XMLHttpRequest();  4        if(xmlhttprequest.overrideMimeType){  5            xmlhttprequest.overrideMimeType("text/xml");  6  }  7    }else if(window.ActiveXObject){  8        var activeName=["MSXML2.XMLHTTP","Microsoft.XMLHTTP"];  9        for(var i=0;i<activeName.length;i++){ 10            try{ 11                xmlhttprequest=new ActiveXObject(activeName[i]); 12                break; 13            }catch(e){ 14                         
15  } 16  } 17  } 18      
19    if(xmlhttprequest==undefined || xmlhttprequest==null){ 20        alert("XMLHttpRequest对象建立失败!!"); 21    }else{ 22        this.xmlhttp=xmlhttprequest; 23    } 

第二步:注册回调方法:跨域

 1 <span style="font-size:18px;">xmlhttp.onreadystatechange=callback; 2 </span>  浏览器

第三步:设置和服务器交互的相应参数:缓存

 1 <span style="font-size:18px;"> xmlhttp.open("GET","ajax?name=" +userName,true); 2 </span> 服务器

第四步:设置向服务器端发送的数据,启动和服务器端的交互:app

 1 <span style="font-size:18px;"> xmlhttp.send(null);</span>  框架

第五步:判断和服务器端的交互是否完成,还要判断服务器端是否返回正确的数据:

 1 <span style="font-size:18px;">//根基实际条件写callback的功能代码 
 2 function callback(){  3      if(xmlhttp.readState==4){  4          //表示服务器的相应代码是200;正确返回了数据 
 5         if(xmlhttp.status==200){  6             //纯文本数据的接受方法 
 7             var message=xmlhttp.responseText;  8             //使用的前提是,服务器端须要设置content-type为text/xml 
 9             //var domXml=xmlhttp.responseXML; 
10             //其它代码 
11  } 12  } 13  } 14 </span> 

 经过这五步XMLHttpRequest基本上就建立好,能够正常使用了,可是这是须要很是多的代码的,总不能每次建立都写这么多吧?固然不是了,咱们学习了面向对象,咱们将其必要相同的部分都抽象出来,使之成为一个独立类,别的直接调用便可,在网上看了一个,感受写的挺好:

 1 //类的构建定义,主要职责就是新建XMLHttpRequest对象 
 2 var MyXMLHttpRequest=function(){  3     var xmlhttprequest;  4     if(window.XMLHttpRequest){  5         xmlhttprequest=new XMLHttpRequest();  6         if(xmlhttprequest.overrideMimeType){  7             xmlhttprequest.overrideMimeType("text/xml");  8  }  9     }else if(window.ActiveXObject){ 10         var activeName=["MSXML2.XMLHTTP","Microsoft.XMLHTTP"]; 11         for(var i=0;i<activeName.length;i++){ 12             try{ 13                 xmlhttprequest=new ActiveXObject(activeName[i]); 14                 break; 15             }catch(e){ 16                          
17  } 18  } 19  } 20       
21     if(xmlhttprequest == undefined || xmlhttprequest == null){ 22         alert("XMLHttpRequest对象建立失败!!"); 23     }else{ 24         this.xmlhttp=xmlhttprequest; 25  } 26       
27     //用户发送请求的方法 
28     MyXMLHttpRequest.prototype.send=function(method,url,data,callback,failback){ 29         if(this.xmlhttp!=undefined && this.xmlhttp!=null){ 30             method=method.toUpperCase(); 31             if(method!="GET" && method!="POST"){ 32                 alert("HTTP的请求方法必须为GET或POST!!!"); 33                 return; 34  } 35             if(url==null || url==undefined){ 36                 alert("HTTP的请求地址必须设置!"); 37                 return ; 38  } 39             var tempxmlhttp=this.xmlhttp; 40             this.xmlhttp.onreadystatechange=function(){ 41                 if(tempxmlhttp.readyState==4){ 42                     if(temxmlhttp.status==200){ 43                         var responseText=temxmlhttp.responseText; 44                         var responseXML=temxmlhttp.reponseXML; 45                         if(callback==undefined || callback==null){ 46                             alert("没有设置处理数据正确返回的方法"); 47                             alert("返回的数据:" + responseText); 48                         }else{ 49  callback(responseText,responseXML); 50  } 51                     }else{ 52                         if(failback==undefined ||failback==null){ 53                             alert("没有设置处理数据返回失败的处理方法!"); 54                             alert("HTTP的响应码:" + tempxmlhttp.status + ",响应码的文本信息:" + tempxmlhttp.statusText); 55                         }else{ 56  failback(tempxmlhttp.status,tempxmlhttp.statusText); 57  } 58  } 59  } 60  } 61               
62             //解决缓存的转换 
63             if(url.indexOf("?")>=0){ 64                 url=url + "&t=" + (new Date()).valueOf(); 65             }else{ 66                 url=url+"?+="+(new Date()).valueOf(); 67  } 68               
69             //解决跨域的问题 
70             if(url.indexOf("http://")>=0){ 71                 url.replace("?","&"); 72                 url="Proxy?url=" +url; 73  } 74             this.xmlhttp.open(method,url,true); 75               
76             //若是是POST方式,须要设置请求头 
77             if(method=="POST"){ 78                 this.xmlhttp.setRequestHeader("Content-type","application/x-www-four-urlencoded"); 79  } 80             this.xmlhttp.send(data); 81     }else{ 82         alert("XMLHttpRequest对象建立失败,没法发送数据!"); 83  } 84     MyXMLHttpRequest.prototype.abort=function(){ 85         this.xmlhttp.abort(); 86  } 87  } 88 }  

  固然这些都须要咱们在实践中不断的摸索,使用,再总结属于本身的一套经常使用类,方法等。固然XMLHttpRequest还有“浏览器缓存问题”,“中文乱码问题”,“跨域访问问题”等等。

相关文章
相关标签/搜索