ajax原理(原生js详解)

什么是ajax?

AJAX即”Asynchronous Javascript And XML“(异步JavaScript和XML),是指一种创建交互式网页应用的网页开发技术。

通过在后台与服务器进行少量数据交换,AJAX可以是网页实现异步更新。这就意味着可以在不重新加载整个网页的情况下,对网页的某部分进行局部更新。

如何使用AJAX?

第一步:创建一个异步调用对象

1 let xhr = new XMLHttpRequest();

第二步:创建一个新的‘HTTP’请求

1 xhr.open('get','http://shujvjiekou.php',true);

参数一:请求方式(get/post/put...);参数二:请求地址(接口地址);参数三:是否异步

第三步:发送解析,不涉及传输数据的话,参数为空。

1 xhr.send();

在send过程中要进行5步操作

第一步:请求初始化(open没有调用)。                         就绪状态码表示为0

第二步:请求已经建立,但是还没有发送。                    就绪状态码表示为1

第三步:请求已经发送,准备处理。                               就绪状态码表示为2

第四步:请求处理,获取内容的基本信息。                     就绪状态码表示为3

第五步:请求响应全部完成,响应服务器的一切内容。   就绪状态码表示为4

第四步:取到接口数据。

 1 xhr.onreadystatechange = function () {
 2             if (xhr.readyState == 4) {//就绪码为4,代表请求相应完成
 3                 if (xhr.status === 200) {//http状态码为200时(连接成功)
 4                     let data = JSON.parse(xhr.responseText);//获取接口返回的数据。类型是字符串。并将json格式字符串转换为对象
 5                 }else {
 6                     //抛错
 7                     throw new Error('接口地址有误' + xhr.status);//.status   http状态码
 8                 }
 9             }
10         }

如果向后端传输数据?

1.如果是通过get方式,那么我们可以把数据放在请求地址中,将数据用“?”连接。

需要注意的是,如果传输数据是一个对象,那么我们需要对对象进行处理。

 1 function objtostring(obj) {
 2             if (Object.prototype.toString.call(obj).slice(8, -1) === 'Object') {
 3                 let arr = [];
 4                 for (let attr in obj) {
 5                     arr.push(attr + '=' + obj[attr])//[a=1, b=2 ,c=3]
 6                 }
 7                 return arr.join('&');////a=1&b=2&c=3
 8             } else {
 9                 throw new Error('你输入的不是对象格式');
10             }
11         }

2.如果是通过post传输,我们需要注意的是,必须要设置请求头!

1 xhr.setRequestHeader('content-type', 'application/x-www-form-urlencoded');

传输的数据放在send里面。

用原生js封装一个简单的ajax

 1         //ajax四部曲
 2         function $ajax(obj) {
 3             //判断传输的数据是否是对象
 4             function objtostring(obj) {
 5                 //定义一个空数组
 6                 let arr = [];
 7                 if (Object.prototype.toString.call(obj).slice(8, -1) === 'Object') {
 8                     for (let value in obj) {
 9                         arr.push(value + '=' + obj[value]);
10                     }
11                     return arr.join('&');//将数组转换成由&拼接的字符串;
12                 } else {
13                     throw new Error('你输入的不是一个纯粹的对象');
14                 }
15             }
16 
17             let ajax = new XMLHttpRequest();
18 
19             //设置传输方式默认为get
20             obj.type = obj.type || 'get';
21 
22 
23             //设置传输地址,让地址不能为空;
24             if (!obj.url) {
25                 throw new Error("接口地址不能为空");
26             }
27 
28             //设置是否异步
29             if (obj.async === 'false' || obj.async === false) {
30                 obj.async = false;
31             } else {
32                 obj.async = true;
33             }
34 
35 
36             //如果传输数据时,要对get和post方式进行不同的兼容处理
37             if (obj.data) {//判断是否传输数据
38                 //如果传输数据时
39                 if (Object.prototype.toString.call(obj.data).slice(8, -1) === 'Object') {//判断传输数据是否为对象
40                     obj.data = objtostring(obj.data);
41                 } else {//不是对象
42                     obj.data = obj.data;
43                 }
44             }
45 
46             //如果传输数据存在,且传输方式为get时
47             if (obj.data && obj.type === 'get') {
48                 obj.url += '?' + obj.data;
49             }
50 
51             ajax.open(obj.type, obj.url, obj.async);
52 
53             //如果传输数据存在,且传输方式为post时
54             if (obj.data && obj.type == 'post') {
55                 ajax.setRequestHeader('content-type', 'application/x-www-form-urlencoded');
56                 ajax.send(obj.data);
57             } else {
58                 ajax.send();
59             }
60 
61             //当obj.async没有设置异步时,就是同步,无需监听;当设置异步时,就必须监听
62             if (obj.async) {//异步时
63                 ajax.onreadystatechange = function () {
64                     if (ajax.readyState === 4) {//请求成功
65                         if (ajax.status === 200) {//接口地址正确
66                             //当对象中有success属性,且该属性类型为函数
67                             obj.success && typeof obj.success === 'function' && obj.success(ajax.responseText);
68                         } else {
69                             obj.error && typeof obj.error === 'function' && obj.error('接口地址有误' + ajax.status);
70                         }
71                     }
72                 }
73             } else {//同步时
74                 if (ajax.status === 200) {
75                     obj.success && typeof obj.success === 'function' && obj.success(ajax.responseText);
76                 } else {
77                     obj.error && typeof obj.error === 'function' && obj.error('接口地址有误' + ajax.status);
78                 }
79             }
80 
81         }

调用:

 1         $ajax({
 2             type:'get',
 3             url:'http://phpget.php',
 4             data:{
 5                 username:'zhangsan'
 6             },
 7             async:true,
 8             success:function(str){
 9                 console.log(JSON.parse(str));
10             },
11             error:function(e){
12                 console.log(e);
13             }
14         })

此原生js只适合去理解ajax,如果项目中使用的话,最好还是使用框架中的一些简易操作。

比如:jQuery中,引入后直接调用就可以。

 1     $.ajax({
 2             type: 'post',//请求类型,默认get
 3             url: 'http://data.php',//接口地址
 4             data: {//传输数据
 5                 username:'zhangsan'
 6             },
 7             async: true,//默认异步
 8             dataType: 'json',//数据类型  JSON就会生成一个JavaScript对象
 9         }).done(function (d) {//请求成功
10             console.log(d);
11         }).fail(function (err) {//请求失败
12             console.log(err);
13         })
原文地址:https://www.cnblogs.com/yznotes/p/12717709.html