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 */