30. Ajax

一、创建 ajax 对象

在 IE 中可能会遇到三种不同版本的 XHR 对象,即 MSXML2.XMLHttp 、MSXML2.XMLHttp.3.0 和 MXSML2.XMLHttp.6.0 。所以在创建对象时,有兼容问题:

<xmp>
var xhr = new XMLHttpRequest();   //for ie6 以上
var xhr = new ActiveXObject('Microsoft.XMLHTTP'); //for ie6
</xmp>

合并上面的代码:

<xmp>
var xhr= null;
if(window.XMLHttpRequest){
    xhr= new XMLHttpRequest();
}else{
    xhr= new ActiveXObject('Microsoft.XMLHTTP');
}
</xmp>

二、连接服务器

在使用 XHR 对象时,要调用的第一个方法是 open() ,open() 方法有三个参数,第一个参数是连接方法即 GET 和 POST,第二个参数是 URL 即所要读取数据的地址,第三个参数是否异步,它是个布尔值,true 为异步,false 为同步。

<xmp>
xhr.open("get", "example.php", true);
</xmp>

三、发送请求

要发送特定的请求,必须像下面这样调用 send() 方法:

<xmp>
xhr.send(null);
</xmp>

这里的 send() 方法接收一个参数,即要作为请求主体发送的数据。如果不需要通过请求主体发送数据,则必须传入 null ,因为这个参数对有些浏览器来说是必需的。

四、接收返回值

当请求被发送到服务器时,我们需要执行一些基于响应的任务。onreadystatechange 事件。检测 XHR 对象的 readyState 属性,该属性表示请求/响应过程的当前活动阶段。这个属性可取的值如下:

参数描述
0未初始化,尚未调用 open() 方法。
1启动,已经调用 open() 方法,但尚未调用 send() 方法。
2发送,已经调用 send() 方法,但尚未接收到响应。
3接收,已经接收到部分响应数据。
4完成,已经接收到全部响应数据,而且已经可以在客户端使用了。

在接收到响应后,第一步是检查 status 属性,以确定响应已经成功返回。
200 => 成功
304 => 资源并没有被修改
为确保接收到适当的响应,应该像下面这样检查上述这两种状态代码:

<xmp>
xhr.open("get", "example.txt", false);
xhr.send(null);
if (xhr.status === 200 || xhr.status == 304){
    alert("Request was successful: " + xhr.status);
} else {
    alert("Request was faild: " + xhr.responseText);
}
</xmp>

五、HTTP头部信息

每个 HTTP 请求和响应都会带有相应的头部信息:

参数描述
Accept浏览器能够处理的内容类型。
Accept-Charset浏览器能够显示的字符集。
Accept-Encoding浏览器能够处理的压缩编码。
Accept-Language浏览器当前设置的语言。
Connection浏览器与服务器之间连接的类型。
Cookie当前页面设置的任何 Cookie。
Host发出请求的页面所在的域 。
Referer发出请求的页面的 URI。注意,HTTP 规范将这个头部字段拼写错了,而为保证与规范一致,也只能将错就错了。(这个英文单词的正确拼法应该是 referrer。)
User-Agent浏览器的用户代理字符串。

六、进度事件

参数描述
loadstart在接收到响应数据的第一个字节时触发。
progress在接收响应期间持续不断地触发。
error在请求发生错误时触发。
abort在因为调用 abort() 方法而终止连接时触发。
load在接收到完整的响应数据时触发。
loadend在通信完成或者触发 error 、 abort 或 load 事件后触发。
<xmp>
var xhr = createXHR();
xhr.onload = function(){
  if ((xhr.status >= 200 && xhr.status < 300) || xhr.status == 304){
    alert(xhr.responseText);
  } else {
    alert("Request was unsuccessful: " + xhr.status);
  }
};
xhr.open("get", "altevents.php", true);
xhr.send(null);
</xmp>

七、AJAX函数整合封装

<xmp>
function ajax(url, fnSucc, fnFaild){
    //1.创建对象
    var xhr = null;
    if(window.XMLHttpRequest){
        xhr = new XMLHttpRequest();
    }else{
        xhr = new ActiveXObject("Microsoft.XMLHTTP");
    }
      
    //2.连接服务器  
    xhr.open('GET', url, true);   //open(方法, url, 是否异步)
      
    //3.发送请求  
    xhr.send(null);
      
    //4.接收返回
    xhr.onreadystatechange = function(){  //OnReadyStateChange事件
        if(xhr.readyState == 4){  //4为完成
            if(xhr.status == 200 || xhr.status==304){    //200为成功
                fnSucc(xhr.responseText) 
            }else{
                if(fnFaild){
                    fnFaild();
                }
            }
        }
    };
}

//调用
ajax('abc.txt',function(str){
   oCon.innerHTML = str;
});
</xmp>
评论

0 条评论