Ajax 运行原理及实现

1. Ajax 运行原理

Ajax 相当于浏览器发送请求与接收响应的代理人,以实现在不影响用户浏览页面的情况下,局部更新页面数据,从而提高用户体验。

image.png

2. Ajax 的实现步骤

2.1. 创建 Ajax 对象

var xhr = new XMLHttpRequest();
复制代码

2.2. 告诉 Ajax 请求地址以及请求方式

xhr.open('get', 'http://www.example.com');
复制代码

2.3. 发送请求

xhr.send();
复制代码

2.4. 获取服务器端给与客户端的响应数据

xhr.onload = function () {
    console.log(xhr.responseText);
}
复制代码

3. 服务器端响应的数据格式

在真实的项目中,服务器端大多数情况下会以 JSON 对象作为响应数据的格式。当客户端拿到响应数据时,要将 JSON 数据和 HTML 字符串进行拼接,然后将拼接的结果展示在页面中。

在 http 请求与响应的过程中,无论是请求参数还是响应内容,如果是对象类型,最终都会被转换为对象字符串进行传输。

JSON.parse() // 将 json 字符串转换为json对象
复制代码

4. 请求参数传递

4.1. 传统网站表单提交

<form method="get" action="http://www.example.com">
    <input type="text" name="username"/>
    <input type="password" name="password">
</form>
<!– http://www.example.com?username=zhangsan&password=123456 -->
复制代码

4.2. GET 请求方式

xhr.open('get', 'http://www.example.com?name=zhangsan&age=20');
复制代码

4.3. POST 请求方式

xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded') 
xhr.send('name=zhangsan&age=20');
复制代码

5. 请求报文

在 HTTP 请求和响应的过程中传递的数据块就叫报文,包括要传送的数据和一些附加信息,这些数据和信息要遵守规定好的格式。

image.png

6. 请求参数的格式

6.1. application/x-www-form-urlencoded

name=zhangsan&age=20&sex=男
复制代码

6.2. application/json

{name: 'zhangsan', age: '20', sex: '男'}
复制代码

在请求头中指定 Content-Type 属性的值是 application/json,告诉服务器端当前请求参数的格式是 json。

JSON.stringify() // 将json对象转换为json字符串
复制代码

注意:get 请求是不能提交 json 对象数据格式的,传统网站的表单提交也是不支持 json 对象数据格式的。

7. 获取服务器端的响应

7.1. Ajax 状态码

在创建ajax对象,配置ajax对象,发送请求,以及接收完服务器端响应数据,这个过程中的每一个步骤都会对应一个数值,这个数值就是ajax状态码。

  • 0:请求未初始化(还没有调用open())
  • 1:请求已经建立,但是还没有发送(还没有调用send())
  • 2:请求已经发送
  • 3:请求正在处理中,通常响应中已经有部分数据可以用了
  • 4:响应已经完成,可以获取并使用服务器的响应了

xhr.readyState // 获取Ajax状态码

7.2. onreadystatechange 事件

当 Ajax 状态码发生变化时将自动触发该事件。

在事件处理函数中可以获取 Ajax 状态码并对其进行判断,当状态码为 4 时就可以通过 xhr.responseText 获取服务器端的响应数据了。

// 当Ajax状态码发生变化时
xhr.onreadystatechange = function () {
    // 判断当Ajax状态码为4时
    if (xhr.readyState == 4) {
        // 获取服务器端的响应数据
        console.log(xhr.responseText);
    }
}
复制代码

7.3. 两种获取服务器端响应方式的区别

区别描述 onload事件 onreadystatechange事件
是否兼容IE低版本 不兼容 兼容
是否需要判断Ajax状态码 不需要 需要
被调用次数 一次 多次

8. Ajax 错误处理

  1. 网络畅通,服务器端能接收到请求,服务器端返回的结果不是预期结果。

可以判断服务器端返回的状态码,分别进行处理。xhr.status 获取http状态码

  1. 网络畅通,服务器端没有接收到请求,返回404状态码。

检查请求地址是否错误。

  1. 网络畅通,服务器端能接收到请求,服务器端返回500状态码。

服务器端错误,找后端程序员进行沟通。

  1. 网络中断,请求无法发送到服务器端。

会触发xhr对象下面的onerror事件,在onerror事件处理函数中对错误进行处理。

9. 低版本 IE 浏览器的缓存问题

问题:在低版本的 IE 浏览器中,Ajax 请求有严重的缓存问题,即在请求地址不发生变化的情况下,只有第一次请求会真正发送到服务器端,后续的请求都会从浏览器的缓存中获取结果。即使服务器端的数据更新了 ,客户端依然拿到的是缓存中的旧数据。

解决方案:在请求地址的后面加请求参数,保证每一次请求中的请求参数的值不相同。

xhr.open('get', 'http://www.example.com?t=' + Math.random());
复制代码
© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享