1 // 通过createXHR()函数创建一个XHR对象
2 function createXHR() {
3 if(window.XMLHttpRequest) { // IE7、Firefox、Opera、Chrome和Safari
4 return new XMLHttpRequest();
5 }else if(window.ActiveXObject) { // IE6以下
6 var versions = ['MSXML2.XMLHttp','Microsoft.XMLHTTP'];
7 for (var i=0,len = versions.length; i<len; i++){
8 try{
9 return new ActiveXObject(versions[i]);
10 break
11 } catch (e) {
12 console.log(e)
13 }
14 }
15 } else {
16 throw new Error('此浏览器不支持XHR对象')
17 }
18 }
19
20 //封装ajax,参数为一个对象
21 function ajax(obj) {
22 var xhr = createXHR(); //创建XHR对象
23 // 通过使用随机字符串解决IE浏览器第二次默认获取缓存的问题
24 obj.url = obj.url + '?rand=' + Math.random();
25 obj.data = params(obj.data); //通过params()将名值对转换成字符串
26 //在使用XHR对象时,必须先调用open()方法
27 //它接收三个参数,:请求类型(get、post)、请求的URL和表示是否异步
28 xhr.open(obj.method,obj.url,obj.async) //打开和服务的链接
29 //若是get请求,则将数据加到url后面
30 if(obj.method === 'get'){
31 obj.url += obj.url.indexOf('?') === -1? '?'+ obj.data : '&' + obj.data;
32 }
33 //如果是post请求
34 if (obj.method === 'post'){
35 //post需要自己设置http的请求头,来模仿表单提交
36 xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
37 xhr.send(obj.data) //post方式将数据放在send()方法里 //send动作才是真正的给服务器按照上面open的url发送请求
38 } else {
39 xhr.send(null); //get方式则填null
40 }
41
42 xhr.onreadystatechange = function () {
43 if (xhr.readyState == 4){ //判断对象的状态是否完成
44 callback() //回调函数
45 }
46 }
47
48 function callback() {
49 if (xhr.status == 200 || xhr.status == 304) { //判断http的交互是否成功,200表示成功
50 obj.success(xhr.responseText); //回调传递参数
51 } else {
52 alert('获取数据错误!错误代号:' + xhr.status + ',错误信息:' + xhr.statusText)
53 }
54 }
55 }
56
57 //名值对转换为字符串
58 function params(data) {
59 var arr = [];
60 for (var i in data) {
61 //特殊字符传参产生的问题可以使用encodeURIComponent()进行编码处理
62 arr.push(encodeURIComponent(i)+ '=' + encodeURIComponent(data[i]))
63 }
64 return arr.join('&')
65 }