封装ajax

  1 /*ajax请求*/
  2 function ajax(params) {
  3     params = params || {};
  4     params.data = params.data || {};
  5     // 判断是ajax请求还是jsonp请求
  6     var json = params.jsonp ? jsonp(params) : json(params);
  7 
  8     // ajax请求   
  9 
 10     function json(params) {
 11         //  请求方式,默认是GET
 12         params.type = (params.type || 'GET').toUpperCase();
 13         // 避免有特殊字符,必须格式化传输数据  
 14         params.data = formatParams(params.data);
 15         var xhr = null;
 16         // 实例化XMLHttpRequest对象   
 17         if (window.XMLHttpRequest) {
 18             xhr = new XMLHttpRequest();
 19         } else {
 20             // IE6及其以下版本   
 21             xhr = new ActiveXObjcet('Microsoft.XMLHTTP');
 22         };
 23 
 24         // 监听事件,只要 readyState 的值变化,就会调用 readystatechange 事件 
 25         xhr.onreadystatechange = function () {
 26             //  readyState属性表示请求/响应过程的当前活动阶段,4为完成,已经接收到全部响应数据
 27             if (xhr.readyState == 4) {
 28                 var status = xhr.status;
 29                 //  status:响应的HTTP状态码,以2开头的都是成功
 30                 if (status >= 200 && status < 300) {
 31                     var response = '';
 32                     // 判断接受数据的内容类型  
 33                     var type = xhr.getResponseHeader('Content-type');
 34                     if (type.indexOf('xml') !== -1 && xhr.responseXML) {
 35                         response = xhr.responseXML; //Document对象响应   
 36                     } else if (type === 'application/json') {
 37                         response = JSON.parse(xhr.responseText); //JSON响应   
 38                     } else {
 39                         response = xhr.responseText; //字符串响应   
 40                     };
 41                     // 成功回调函数 
 42                     params.success && params.success(response);
 43                 } else {
 44                     params.error && params.error(status);
 45                 }
 46             };
 47         };
 48 
 49         // 连接和传输数据   
 50 
 51         if (params.type == 'GET') {
 52             // 三个参数:请求方式、请求地址(get方式时,传输数据是加在地址后的)、是否异步请求(同步请求的情况极少);
 53             xhr.open(params.type, params.url + '?' + params.data, true);
 54             xhr.send(null);
 55         } else {
 56             xhr.open(params.type, params.url, true);
 57             //必须,设置提交时的内容类型   
 58             xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8');
 59             // 传输数据  
 60             xhr.send(params.data);
 61         }
 62     }
 63 
 64 
 65     // jsonp请求   
 66 
 67     function jsonp(params) {
 68         //创建script标签并加入到页面中   
 69         var callbackName = params.jsonp;
 70         var head = document.getElementsByTagName('head')[0];
 71         // 设置传递给后台的回调参数名   
 72         params.data['callback'] = callbackName;
 73         var data = formatParams(params.data);
 74         var script = document.createElement('script');
 75         head.appendChild(script);
 76 
 77         //创建jsonp回调函数   
 78         window[callbackName] = function (json) {
 79             head.removeChild(script);
 80             clearTimeout(script.timer);
 81             window[callbackName] = null;
 82             params.success && params.success(json);
 83         };
 84 
 85         //发送请求   
 86         script.src = params.url + '?' + data;
 87 
 88         //为了得知此次请求是否成功,设置超时处理   
 89         if (params.time) {
 90             script.timer = setTimeout(function () {
 91                 window[callbackName] = null;
 92                 head.removeChild(script);
 93                 params.error && params.error({
 94                     message: '超时'
 95                 });
 96             }, time);
 97         }
 98     };
 99 
100     //格式化参数   
101     function formatParams(data) {
102         var arr = [];
103         for (var name in data) {
104             arr.push(encodeURIComponent(name) + '=' + encodeURIComponent(data[name]));
105         };
106         // 添加一个随机数,防止缓存   
107         arr.push('v=' + random());
108         return arr.join('&');
109     }
110 
111     // 获取随机数   
112 
113     function random() {
114         return Math.floor(Math.random() * 10000 + 500);
115     }
116 }
117 
118 /*
119 //ajax请求测试
120 ajax({
121     url: 'test.ashx',   // 请求地址
122     type: 'POST',   // 请求类型,默认"GET",还可以是"POST"
123     data: { name: '测试' },   // 传输数据
124     success: function (res) {   // 请求成功的回调函数
125         console.log(JSON.parse(res));
126     },
127     error: function (error) { }   // 请求失败的回调函数
128 });
129 
130 
131 //jsonp测试
132 ajax({
133     url: 'test.ashx',    // 请求地址
134     jsonp: 'jsonpCallback',  // 采用jsonp请求,且回调函数名为"jsonpCallbak",可以设置为合法的字符串
135     data: { 'name': '测试' },   // 传输数据
136     success: function (res) {   // 请求成功的回调函数
137         console.log(res);
138     },
139     error: function (error) { }   // 请求失败的回调函数
140 });
141 */

 

posted @ 2017-09-05 18:40  清幽紫竹  Views(124)  Comments(0)    收藏  举报