XMLHttpRequest对象进行Ajax操作

时间:2021-06-05 14:30:59

XMLHttpRequest 对象的三个常用的属性:

1. onreadystatechange 属性
  onreadystatechange 属性存有处理服务器响应的函数。

请求状态改变的事件触发器(readyState变化时会调用这个属性上注册的javascript函数)。

下面的代码定义一个空的函数:

xmlHttp.onreadystatechange=function(){
    // 我们需要在这里写一些代码
  }
2.readyState 属性
   readyState 属性存有服务器响应的状态信息。每当 readyState 改变时,onreadystatechange 函数就会被执行。

readyState有五种可能的值
  0 - (Uninitialized 未初始化)对象已创建,未调用open()方法
  1 - (Loading 载入)open()方法成功调用,但send()方法未调用
  2 - (Loaded 载入完成)send()方法已经调用,尚未开始接受数据
  3 - (Interactive 交互)正在接受数据,Http响应头信息已经接受,但尚未接收完成
  4 - (Completed 完成)响应数据接受完成,可以在客户端调用了

我们要向这个 onreadystatechange 函数添加一条 if 语句,来测试我们的响应是否已完成(意味着可获得数据):

xmlHttp.onreadystatechange=function(){
     if(xmlHttp.readyState==4){
       // 从服务器的response获得数据
     }
 }
3.responseText 属性
   可以通过 responseText 属性来取回由服务器返回的数据,该属性代表的是从Server端返回的一个string格式的响应。
   document.myForm.time.value=xmlHttp.responseText;

4.responseXML 属性

代表从Server端传回的XML格式的数据,可以直接被当作DOM对象使用。(服务器响应的XML内容对应的DOM对象)

5.status属性

这个在HTTP响应中的响应码。200代表响应成功,404表示“未找到”,500表示“服务器内部错误”等。

所以一般在status==200才进行响应数据的操作,如果不是200,那说明HTTP响应不正常,也就不用处理。

6.statusText属性

服务器返回状态的文本信息,即HTTP协议中跟在响应码后面的相应说明串。例如200 后面就会跟着OK。

XMLHttpRequest 对象的方法

1.open(String method,string url,boolean asynch,String username,String password)方法

open() 主要有三个参数需要设定。
   第一个参数method定义发送请求所使用的方法,一般使用"GET","POST"。
   第二个参数url表示请求的服务器的地址。
   第三个参数asynch表示是否采用异步方法,true为异步,false为同步。

后边两个参数可以不指定,username和password分别表示用户名和密码,提供http认证机制需要的用户名和密码。

例如:xmlHttp.open("GET","/NewServlet",true);

2.send(content) 方法

send(content) 方法将请求送往服务器。

向服务器发出请求,如果采用异步方式,该方法会立即返回。

content可以指定为null表示不发送数据,其内容可以是DOM对象,输入流或字符串。

3.setRequestHeader(String header,String Value)

设置HTTP请求中的指定头部header的值为value,此方法需在open方法以后调用,一般在post方式中使用。

4.getAllResponseHeaders()

返回包含Http的所有响应头信息,其中相应头包括Content-length,date,uri等内容。

返回值是一个字符串,包含所有头信息,其中每个键名和键值用冒号分开,每一组键之间用CR和LF(回车加换行符)来分隔!

5.getResponseHeader(String header)

返回Http响应头中指定的键名header对应的值

6.abort()

停止当前http请求。对应的XMLHttpRequest对象会复位到未初始化的状态。

XMLHttpRequest对象进行Ajax操作的示例代码如下:

 var xmlhttp;
 function loadAjax(url){
     xmlhttp=null;
     if (window.XMLHttpRequest){// code for all new browsers
         xmlhttp=new XMLHttpRequest();
     }else if (window.ActiveXObject){// code for IE5 and IE6
         xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
     }
     if (xmlhttp!=null){
         xmlhttp.onreadystatechange=state_Change;//定义回调函数
         xmlhttp.open("POST",url,true);
         xmlhttp.send(null);
     }else{
        alert("你的浏览器不支持xmlhttp!");
     }
 }
 function state_Change(){
     if (xmlhttp.readyState==4){
         if (xmlhttp.status==200){// 200 = OK
             var message=xmlhttp.responseText;//获取服务端响应的文本
             //var domXml=xmlhttp.responseXML;//获取服务器响应的XML内容对应的DOM对象,使用的前提是,服务器端需要设置content-type为text/xml
             //其它代码
         }else{
             alert("解析响应数据出现问题");
         }
     }
 }

网上找的别人写的封装好的代码,感觉不错,贴在这:

 //类的构建定义,主要职责就是新建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);  

             //如果是POST方式,需要设置请求头
             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();
     }
   }
 }