用原生js实现ajax

 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 }

 

原文地址:https://www.cnblogs.com/zhaobao1830/p/7161185.html