AJAX你们已经都知道了,是为了实现异步通信,提升用户体验度,而将不少旧知识(XML,DOM,JavaScript,HTML,jQuery,Css……)从新融合的一个新的知识框架。而,XMLHttpRequest对象则是其中的重重之中。这篇博客重点总结一下这个对象的使用。固然仍是按照经典的五步法来学习,之后在实践中有更多更好的想法,会拿出来分享的!javascript
首先,须要先了解这个对象的属性和方法:java
属性jquery |
说明ajax |
readyState跨域 |
表示XMLHttpRequest对象的状态:0:未初始化。对象已建立,未调用open;浏览器 1:open方法成功调用,但Sendf方法未调用;缓存 2:send方法已经调用,还没有开始接受数据;服务器 3:正在接受数据。Http响应头信息已经接受,但还没有接收完成;app 4:完成,即响应数据接受完成。框架 |
Onreadystatechange |
请求状态改变的事件触发器(readyState变化时会调用这个属性上注册的javascript函数)。 |
responseText |
服务器响应的文本内容 |
responseXML |
服务器响应的XML内容对应的DOM对象 |
Status |
服务器返回的http状态码。200表示“成功”,404表示“未找到”,500表示“服务器内部错误”等。 |
statusText |
服务器返回状态的文本信息。 |
方法 |
说明 |
Open(string method,string url,boolean asynch, String username,string password) |
指定和服务器端交互的HTTP方法,URL地址,即其余请求信息; Method:表示http请求方法,通常使用"GET","POST". url:表示请求的服务器的地址; asynch:表示是否采用异步方法,true为异步,false为同步; 后边两个能够不指定,username和password分别表示用户名和密码,提供http认证机制须要的用户名和密码。 |
Send(content) |
向服务器发出请求,若是采用异步方式,该方法会当即返回。 content能够指定为null表示不发送数据,其内容能够是DOM对象,输入流或字符串。 |
SetRequestHeader(String header,String Value) |
设置HTTP请求中的指定头部header的值为value. 此方法需在open方法之后调用,通常在post方式中使用。 |
getAllResponseHeaders() |
返回包含Http的全部响应头信息,其中相应头包括Content-length,date,uri等内容。 返回值是一个字符串,包含全部头信息,其中每一个键名和键值用冒号分开,每一组键之间用CR和LF(回车加换行符)来分隔! |
getResponseHeader(String header) |
返回HTTP响应头中指定的键名header对应的值 |
Abort() |
中止当前http请求。对应的XMLHttpRequest对象会复位到未初始化的状态。 |
对这个对象有了静态了了解,知道它长的什么样子,有什么功能了,下边该咱们使用它了,固然这里我也用五步法写出代码来:
第一步:建立XMLHttpRuquest对象:
- var xmlhttprequest;
- if(window.XMLHttpRequest){
- xmlhttprequest=new XMLHttpRequest();
- if(xmlhttprequest.overrideMimeType){
- xmlhttprequest.overrideMimeType("text/xml");
- }
- }else if(window.ActiveXObject){
- var activeName=["MSXML2.XMLHTTP","Microsoft.XMLHTTP"];
- for(var i=0;i<activeName.length;i++){
- try{
- xmlhttprequest=new ActiveXObject(activeName[i]);
- break;
- }catch(e){
-
- }
- }
- }
-
- if(xmlhttprequest==undefined || xmlhttprequest==null){
- alert("XMLHttpRequest对象建立失败!!");
- }else{
- this.xmlhttp=xmlhttprequest;
- }
第二步:注册回调方法
- <span style="font-size:18px;">xmlhttp.onreadystatechange=callback;
- </span>
第三步:设置和服务器交互的相应参数
- <span style="font-size:18px;"> xmlhttp.open("GET","ajax?name=" +userName,true);
- </span>
第四步:设置向服务器端发送的数据,启动和服务器端的交互
- <span style="font-size:18px;"> xmlhttp.send(null);</span>
第五步:判断和服务器端的交互是否完成,还要判断服务器端是否返回正确的数据
- <span style="font-size:18px;">
- function callback(){
- if(xmlhttp.readState==4){
-
- if(xmlhttp.status==200){
-
- var message=xmlhttp.responseText;
-
-
-
- }
- }
- }
- </span>
经过这五步XMLHttpRequest基本上就建立好,能够正常使用了,可是这是须要很是多的代码的,总不能每次建立都写这么多吧?固然不是了,咱们学习了面向对象,咱们将其必要相同的部分都抽象出来,使之成为一个独立类,别的直接调用便可,在网上看了一个,感受写的挺好:
- var MyXMLHttpRequest=function(){
- var xmlhttprequest;
- if(window.XMLHttpRequest){
- xmlhttprequest=new XMLHttpRequest();
- if(xmlhttprequest.overrideMimeType){
- xmlhttprequest.overrideMimeType("text/xml");
- }
- }else if(window.ActiveXObject){
- var activeName=["MSXML2.XMLHTTP","Microsoft.XMLHTTP"];
- for(var i=0;i<activeName.length;i++){
- try{
- xmlhttprequest=new ActiveXObject(activeName[i]);
- break;
- }catch(e){
-
- }
- }
- }
-
- if(xmlhttprequest == undefined || xmlhttprequest == null){
- alert("XMLHttpRequest对象建立失败!!");
- }else{
- this.xmlhttp=xmlhttprequest;
- }
-
-
- MyXMLHttpRequest.prototype.send=function(method,url,data,callback,failback){
- if(this.xmlhttp!=undefined && this.xmlhttp!=null){
- method=method.toUpperCase();
- if(method!="GET" && method!="POST"){
- alert("HTTP的请求方法必须为GET或POST!!!");
- return;
- }
- if(url==null || url==undefined){
- alert("HTTP的请求地址必须设置!");
- return ;
- }
- var tempxmlhttp=this.xmlhttp;
- this.xmlhttp.onreadystatechange=function(){
- if(tempxmlhttp.readyState==4){
- if(temxmlhttp.status==200){
- var responseText=temxmlhttp.responseText;
- var responseXML=temxmlhttp.reponseXML;
- if(callback==undefined || callback==null){
- alert("没有设置处理数据正确返回的方法");
- alert("返回的数据:" + responseText);
- }else{
- callback(responseText,responseXML);
- }
- }else{
- if(failback==undefined ||failback==null){
- alert("没有设置处理数据返回失败的处理方法!");
- alert("HTTP的响应码:" + tempxmlhttp.status + ",响应码的文本信息:" + tempxmlhttp.statusText);
- }else{
- failback(tempxmlhttp.status,tempxmlhttp.statusText);
- }
- }
- }
- }
-
-
- if(url.indexOf("?")>=0){
- url=url + "&t=" + (new Date()).valueOf();
- }else{
- url=url+"?+="+(new Date()).valueOf();
- }
-
-
- if(url.indexOf("http://")>=0){
- url.replace("?","&");
- url="Proxy?url=" +url;
- }
- this.xmlhttp.open(method,url,true);
-
-
- if(method=="POST"){
- this.xmlhttp.setRequestHeader("Content-type","application/x-www-four-urlencoded");
- }
- this.xmlhttp.send(data);
- }else{
- alert("XMLHttpRequest对象建立失败,没法发送数据!");
- }
- MyXMLHttpRequest.prototype.abort=function(){
- this.xmlhttp.abort();
- }
- }
- }
固然这些都须要咱们在实践中不断的摸索,使用,再总结属于本身的一套经常使用类,方法等。固然XMLHttpRequest还有“浏览器缓存问题”,“中文乱码问题”,“跨域访问问题”等等,由于都没有遇到过这些东西,因此这里先了解一下,之后遇到再认真研究!