Ajax,全称为 Async JavaScript and XML(异步 JavaScript 和 XML),一种异步的创建交互式网页的技术,它允许在不刷新整个网页的情况下,与服务器进行数据交换,实现页面的局部更新。这对前后端的交互方式产生了深远的影响,同时也凸显了前端在整个开发体系的重要性
Ajax 的工作步骤
Ajax 的工作原理基于一个简单的理念:通过浏览器内置的 XMLHttpRequest 对象,前端可以与服务器建立非阻塞的连接,从而在后台无声无息地交换数据。这种机制的核心步骤包括创建 XMLHttpRequest 对象、配置请求、发送请求,以及处理服务器响应。
-
创建 XMLHttpRequest 对象: 这就像是为与服务器的通信搭建了一座桥梁。通过
new XMLHttpRequest()来创建。XMLHttpRequest()的一些用法有兴趣的可以去MDN中查看一下。let xhr = new XMLHttpRequest() -
配置请求: 使用
open()方法设置请求的方法(如 GET、POST 等)、目标 URL 和是否异步。xhr.open('GET','https://mock.mengxuegu.com/mock/65a91543c4cd67421b34c898/movie/movieList',true) -
发送请求: 调用
send()方法将请求发送出去。xhr.send() -
处理响应: 通过
onreadystatechange事件监听请求的状态变化。而Ajax 中有 5 种状态:-
0:未初始化,对象已创建,但尚未调用open()方法。
-
1:已打开,
open()方法已被调用,但尚未发送请求。 -
2:已发送,
send()方法已被调用,请求已发送。 -
3:正在接收,服务器正在响应,但尚未完成。
-
4:已完成,服务器响应已完成,数据接收完毕。
-
当状态为 4 且状态码为 200 时,表示请求成功,我们可以获取响应数据并进行处理。因为有些后端传过来的数据是字符串,所以我们需要JSON.parse()来将其转为json对象,方便我们在前端中使用。
```js
xhr.onreadystatechange=()=>{
if(xhr.readyState==4 && xhr.status==200){
console.log(JSON.parse(xhr.responseText))
}
}
```
示例:
以一个获取电影列表数据为例,当我们点击按钮的时候,会向后端请求数据,然后将拿到的数据展示在页面上
<button id="btn">获取电影列表</button>
<ul id="ul"></ul>
<script>
let btn = document.getElementById("btn");
let ul = document.getElementById("ul");
btn.addEventListener("click", ()=>{
// console.log("btn clicked")
// 朝后端发送一个请求
let xhr = new XMLHttpRequest() //创建了一个ajax实例
xhr.open('GET','https://mock.mengxuegu.com/mock/65a91543c4cd67421b34c898/movie/movieList',true)
xhr.send()
xhr.onreadystatechange=()=>{// 实时监测请求的每个阶段
if(xhr.readyState==4 && xhr.status==200){
console.log(JSON.parse(xhr.responseText))
//从浏览器控制台中,可以找到movieList中的是我们需要的数据
const movieList = JSON.parse(xhr.responseText).movieList
for (let i=0; i<movieList.length; i++){
const li = document.createElement("li")
//movieList[i].nm+'--'+movieList[i].star
li.innerText= `${movieList[i].nm}--${movieList[i].star}`
ul.appendChild(li)
}
}
}
})
</script>
运行效果:
我们也可以在检查中查看状态码等。
关于HTTP状态码有以下常见的:
- 以1开头的,一般都是信息类,表示收到客户端请求,正在进一步处理
- 以2 开头的,一般都是成功的信号,表示客户端请求被正确接受、理解和处理
- 以3 开头的,一般为重定向,表示客户端的请求没有成功,需要进一步的处理
- 以4开头的,一般都是错误的信号,表示客户端的请求有错误或者失败
- 以5 开头的,一般也是错误的信号,不过是服务器端的错误,表示服务端不能完成对请求的处理
常用的 Ajax 库
从上面的示例中可以看到,每当我们要向后端请求数据时都要写这么一大段,实在是不太优雅,而且在实际开发中,频繁的手动处理和复杂的错误管理往往令人头疼。所以呢,一系列 Ajax 库应运而生,它们以更简洁的语法、更丰富的功能和更好的错误处理能力,方便我们去写更优雅的代码。
jQuery
jQuery 是一个在前端开发早期时广受欢迎的 JavaScript 库,它里面的$.ajax()方法简化了 Ajax 的使用。其中的$则是该库中的全局变量,是 jQuery 函数的别名。通过这个简单的API,我们可以较为轻松的向后端请求数据。
同样的例子:
<button onclick="getData()">获取电影数据</button>
<ul></ul>
<script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.7.1/jquery.js"></script>
<script>
function getData(){
$.ajax({
url:'https://mock.mengxuegu.com/mock/65a91543c4cd67421b34c898/movie/movieList',
method:'GET',
success:function(data){
console.log(data);
}
})
}
</script>
Axios
Axios 是一个专门用于处理 HTTP 请求的库。他不仅适用于浏览器,也适用于node.js 。提供了统一的 API 接口,使得跨平台开发变得更为便捷。它主要是运用了promise来处理异步问题。
同样的例子:
<button onclick="getData()">获取数据</button>
<script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script>
<script>
function getData(){
axios.get('https://mock.mengxuegu.com/mock/65a91543c4cd67421b34c898/movie/movieList')
.then((res)=>{
console.log(res.data)
})
}
</script>
Fetch
Fetch 是现代浏览器提供的原生 API。他能用更加直观的方式去发送请求,而且Fetch 返回的 Promise 对象,使得异步请求的处理更加优雅,而且他与axios很相似,不过他的语法直观,更易于学习。
同样的例子:
<button onclick="getData()">获取数据</button>
<script>
function getData(){
fetch('https://mock.mengxuegu.com/mock/65a91543c4cd67421b34c898/movie/movieList')
.then((res)=>{
return res.json();
})
.then((data)=>{
console.log(data)
})
}
</script>
结尾
从 XMLHttpRequest 的手动管理到 jQuery 的简洁封装,再到 Axios 和 Fetch API 的现代实践,Ajax 技术及其相关库的发展见证了前端工程领域的不断进步。通过这些库,我们可以更加方便、高效地进行 Ajax 开发,让我们的项目应用更加出色。。希望这篇文章能让您对 Ajax 有一个基本的认识和了解!