石器时代到新时代,AJAX的前世今生
AJAX,异步的Javascript和XML,能够不用加载整个页面的情况下,更新部分网页内容的技术,提供了更流畅、快速的网页交互体验,即使它的名字中有包含XML,但是现在普遍用JSON格式来交换数据。
目前,比较流行的库就是axios、jQuery还有所谓的官方打造的fetch API,为什么会出现这么多第三方库呢?问就是官方“太懒”......接下来,我们一起聊一聊“从钻木取火到用Zipper打火机”。
一、Ajax的关键技术
- 异步通信:它的核心是异步处理,这就代表着用户可以继续与用户交互的同时,脚本在后台发送请求、接收响应,而不用等待这个过程的完成。
- XMLHttpRequest对象:这是实现Ajax功能的关键JavaScript对象,用于在浏览器和服务器之间异步传输数据。虽然名字中包含XML,但实际上Ajax可以传输任何形式的数据,包括JSON、HTML片段等。
- JavaScript:用于操作DOM(文档对象模型),基于用户的事件触发Ajax请求,并处理从服务器返回的数据。
接下来,我们来体验一下使用ajax的场景。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<button id="btn">获取电影列表</button>
<ul id="ul"></ul>
<script>
let btn = document.getElementById('btn')
let ul = document.getElementById('ul')
btn.addEventListener('click', () => {
//朝后端发一个请求,获取到需要的数据
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));
const movieList = JSON.parse(xhr.responseText).movieList;
for(let i = 0;i<movieList.length;i++){
const li = document.createElement('li')
li.innerHTML = `${movieList[i].nm}--${movieList[i].star}` //moveList[i].nm+'--'+moveList[i].star
ul.appendChild(li)
}
}
}
})
</script>
</body>
</html>
- 在js中,只给我们提供了一个,也是唯一一个能与后端交互数据的对象
XMLHttpRequest
,第三方库以及Fetch
方法,都是在这个对象上,进行封装的,接下来,我们来仔细聊聊它的实现过程,其他封装好的库和方法,我们只要会使用就OK了。
- 我们在btn按钮上添加了监听时间,这也是ajax常常应用的场景,form表单的提交,动态的加载内容等.....
- 触发click事件,调用箭头函数,函数内部创建一个ajax实例xhr,用于与后端进行数据的交互。
- 调用open方法,传入三个参(Http请求方法,URL,是否异步),然后send方法发送请求
- 实时检测每个阶段,请求发送成功的话,
xhr.readyState
的值为4,xhr.status
的值为200,这是协议内定好的状态码,然后再往html中添加DOM元素 - 一个动态加载的前后端数据交互的小demo就完成了
值得注意的是,在open方法中,我们进行了异步的处理,同步操作会阻塞用户界面的更新,直到我们数据交互的完成,无法及时的响应用户的交互,极大的造成了用户体验不佳。异步请求允许这些耗时的任务子啊后台进行,提高了整体的流畅性和响应速度。
在浏览器的开发者模式可以查看网络请求的状态
二、HTTP库axios
直接提供了一个简洁的API,让GET、POST等类型的请求变得简单直观。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<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);
})
}
</script>
</body>
</html>
发送请求后,
.then
调用回调函数,传入参数为请求返回的结果,.then
方法让我们能够以非阻塞的方式处理异步操作的结果,使得代码更加清晰和易于维护。
三、JavaScript库jQuery
jQuery内置了对AJAX的支持,使得向服务器请求数据变得更加简单,包括序列化表单、发送请求、处理响应等功能。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<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>
</body>
</html>
在jQuery中$
可以用来发起AJAX请求,如$.ajax({...})
、$.get()
、$.post()
等,使得异步数据交互变得简单易行。在这里,success
调用回调函数。
四、"官方的"fecth
兄弟们,dddd,话不多说,仔细揣摩代码找不同......
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<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>
</body>
</html>
尽管随着原生JavaScript的进步和现代框架(如React、Vue等)的兴起,这些第三方库和AIP的封装,它们见证着历史,XMLHttpRequest
的引入,彻底改变了Web应用的开发模式,开启了现代Web应用开发的新篇章,使得JavaScript成为处理前后端交互、构建复杂Web应用不可或缺的工具。如今我们学习这些,可能不会应用在工作开发中,但它会帮助我们更好的理解和掌握这些技术的更新迭代,着实让人回味无穷。
转载自:https://juejin.cn/post/7382893339182153740