跨浏览器之封装ajax

ajax是异步的javascript和XML,主要用于前端后端的数据传送。

要封装一个ajax,使之能相应的平稳退化,第一步就是创建一个XHR(XMLHttpRequest)对象。

以下代码是在各种浏览器下创建xhr对象:

 1 //创建xhr对象,兼容各种浏览器
 2 function createXHR(){
 3     if(typeof XMLHttpRequest!="undefined"){                                  //IE7以上
 4         return new XMLHttpRequest();
 5     }
 6     else if(typeof ActiveXObject!="underfined"){                            //IE7以下
 7         var version = ["MSXML2.XMLHttp.6.0","MSXML2.XMLHttp.3.0","MSXML2.XMLHttp"],
 8             i, len;
 9         for(i=0,len=version.length;i<len;i++){    
10             try{
11                     new ActiveXObject(version[i]);
12                     arguments.callee.activeXString = version[i];
13                 }catch(e){
14                     //跳过
15                 }
16         }
17         return new ActiveXObject(arguments.callee.activeXString);
18     }
19     else{
20         throw new Error("您的浏览器不支持ajax!");
21     }
22 }

这段代码主要是处理在IE中多种版本的xhr对象怎么实现平稳退化,使之创建的xhr对象能兼容各种版本的IE。

然后开始封装ajax,首先ajax中的open方法里面有要用到一个get或者post的请求方式,然后又用到相应的url,最后是同步异步,那我们完全可以将这些放在一个对象中,将这个对象作为ajax的参数传入。

因为传入的是一个对象,里面需要进行传送的数据,也就可以是包含的另外一个对象,那我们就应该将这个数据对象进行转化为能为我们所用的类型:

1 //序列化对象为字符串数组
2 function serialize(data){                    
3     var result = [];
4     for(var i in data){
5         result.push(encodeURIComponent(i)+"="+encodeURIComponent(data[i]));
6     }
7     return result.join("&");
8 }

此时如果对serialize传入一个数据对象,类似:

1 {
2         "name" : "lee",
3         "age" : "100"
4     }

输出就会是一个长度为2的数组,以&符号进行分隔:

name=lee&age=100

最后将ajax函数写出来:

 1 function ajax(obj){    
 2 
 3     var xhr = createXHR();                                                //创建xhr对象
 4     obj.data = serialize(obj.data);                                    
 5     obj.url+="?ranNum="+Math.random();                                    //解决缓存问题                    
 6     obj.url += (obj.url.indexOf("?") == -1 ? "?" : "&");
 7     
 8     xhr.onreadystatechange=function(){
 9         callback(xhr);
10     }
11     if(obj.method == "get"){                
12         obj.url += obj.data;
13         alert(obj.url);
14         xhr.open(obj.method,obj.url,obj.async);
15         xhr.send(null);
16     }
17     if(obj.method == "post"){
18         alert(obj.url);
19         xhr.open(obj.method,obj.url,obj.async);
20         xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
21         xhr.send(obj.data);
22     }
23 }

代码中将get请求和post请求两种方式分开进行了处理。

callback()方法呢,就是进行响应结束之后的一个判断是否成功,以及响应的处理:

 1 function callback(xhr){
 2     if(xhr.readyState == 4){
 3         if(xhr.status>=200&&xhr.status<=300||xhr.status==304){
 4             alert(xhr.responseText);
 5         }
 6         else{
 7             alert("响应失败"+ xhr.status + xhr.statusText);
 8         }
 9     }
10 }

最后只需要在callback内把alert方法改为返回相应的数据值就可以了。

需要用到时就只需要将传入一个对象运用:

1 ajax({
2     "method" : "get",
3     "url" : "demo.php",
4     "async" : "true",
5     "data" : {
6         "name" : "lee",
7         "age" : "100"
8     }
9 });

最后附上get和post请求的代码,以供参考:

 1 //get方式请求
 2 /*     var xhr = createXHR();
 3     xhr.open("get","demo.php",true);//准备请求
 4     xhr.send(null);//发送请求
 5     xhr.onreadystatechange=function(){//当XHR对象的readyState改变时发生
 6         if(xhr.readyState==4){//响应完成时
 7         if(xhr.status>=200&&xhr.status<=300||xhr.status==304){//响应成功条件
 8             alert(xhr.responseText);
 9         }
10         else{
11             alert("响应失败"+xhr.status+xhr.statusText);
12         }
13     }
14     } */
15     
16 //post方式请求
17 /* var xhr = createXHR();
18     xhr.open("post","demo.php",true);
19     xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded");//不同于get之处
20     xhr.send("name=lee&age=100");//要将相应的数据send出去
21     xhr.onreadystatechange = function(){
22         if(xhr.readyState==4){
23             if(xhr.status>=200&&xhr.status<=300||xhr.status==304){
24                 alert(xhr.responseText);
25             }
26             else{
27                 alert("响应失败"+xhr.status+xhr.statusText);
28             }
29         }
30     } */

 

posted @ 2017-09-04 10:53  JavaScriptBUG  阅读(312)  评论(0编辑  收藏  举报