文章目录
Ajax
一、定义
一、 同步和异步的区别
同步提交:当用户发送请求时,当前页面不可以使用,服务器将数据响应页面到客户端,响应完成后,用户才可以使用页面。
异步提交:当用户发送请求时,当前页面还可以继续使用,当异步请求的数据响应给页面,页面把数据显示出来 。
二、Ajax工作原理
客户端发送请求,请求交给xhr,xhr把请求提交给服务器,服务器进行业务处理,服务器响应数据交给xhr对象,xhr对象接收数据,由javascript把数据写到页面上,如下图所示:
二、创建Ajax五个基本步骤
一、创建XMLHttpRequest对象
在chrome浏览器中创建XMLHttpRequest对象的方式为:
const xhr = new XMLHttpRequest();
二、初始化设置请求方法和url
//POST请求
xhr.open('POST',"http://localhost:xxx");
//GET请求
//xhr.open('GET',"http://localhost:xxx/a=100&b=200");
三、发送(向服务器端发送请求)
GET和POST请求方式不同点:
GET的请求参数在请求地址url中;
POST的请求参数在发送请求Send()中;
//POST请求
xhr.send("a=100&b=200");
//GET请求
//xhr.send();
四、设置响应HTTP请求状态变化的函数
创建完HTTP请求之后,可以将HTTP请求发送给Web服务器了。发送HTTP请求的目的是为了接收从服务器中返回的数据。从创建XMLHttpRequest对象开始,到发送数据、接收数据、XMLHttpRequest对象一共会经历以下5中状态。
1. 未初始化状态。在创建完XMLHttpRequest对象时,该对象处于未初始化状态,此时XMLHttpRequest对象的readyState属性值为0。
2. 初始化状态。在创建完XMLHttpRequest对象后使用open()方法创建了HTTP请求时,该对象处于初始化状态。此时XMLHttpRequest对象的readyState属性值为1。
3. 发送数据状态。在初始化XMLHttpRequest对象后,使用send()方法发送数据时,该对象处于发送数据状态,此时XMLHttpRequest对象的readyState属性值为2。
4. 接收数据状态。Web服务器接收完数据并进行处理完毕之后,向客户端传送返回的结果。此时,XMLHttpRequest对象处于接收数据状态,XMLHttpRequest对象的readyState属性值为3。
5. 完成状态。XMLHttpRequest对象接收数据完毕后,进入完成状态,此时XMLHttpRequest对象的readyState属性值为4。
此时接收完毕后的数据存入在客户端计算机的内存中,可以使用responseText属性或responseXml属性来获取数据。
xhr.onreadystatechange = function(){
//判断状态4:已将数据响应到JS中,进行渲染
if(xhr.readyState==4){
}
}
五、设置获取服务器返回数据的语句
响应状态码:200-300都是成功
if(xhr.status >= 200 && xhr.status < 300){
//处理服务器端结果 行 头 空行 体
//1.响应行
//通过Ajax的异步调用获得服务器端数据之后,使用DOM来将网页中的数据进行局部更新
result.innerHTML = xhr.response;//响应体
}
三、请求方式
下面代码可以直接复制下来,运行看下效果,请求方式,一定要先配置好 Express
axios
Axios 是一个基于 promise 的 HTTP 库,可以用在浏览器和 node.js 中。
从浏览器中创建 XMLHttpRequests;
自动转换 JSON 数据;
支持 Promise API;
axios 发送 AJAX请求
GET和POST请求,使用npm安装一下express,配置服务端,实现前端与服务端进行数据交互。
前端
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>axios 发送 AJAX请求</title>
<script crossorigin="anonymous" src="https://cdn.bootcdn.net/ajax/libs/axios/1.1.3/axios.js"></script>
</head>
<body>
<button>GET</button>
<button>POST</button>
<button>AJAX</button>
<script>
const btns = document.querySelectorAll('button');
btns[0].onclick = function(){
//GET请求
axios.get('http://localhost:xxx/axios-server',{
params:{
id:100,
vip:7
}
}).then(value=>{ //返回消息(比较详细)
console.log(value);
});
}
btns[2].onclick = function(){
axios({
//请求方法
method: 'POST',
//URL
url:'http://localhost:xxx/axios-server',
//Url参数
params: {
a:100,
b:100
}
})
}
</script>
</body>
</html>
服务端
//axios服务
app.all('/axios-server',(request,response)=>{
//设置响应头
response.setHeader('Access-Control-Allow-Origin','*');
//response.setHeader('Access-Control-Allow-Headers','*');
const data = {name: 'XXx'};
// //定时器
setTimeout(() => {
response.send(JSON.stringify(data));
}, 1000);
});
jquery 发送 AJAX请求
前端
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script crossorigin src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.1/jquery.min.js"></script>
</head>
<body>
<div class="container">
<h2 class="page-header">Jquery发送AJAX请求</h2>
<button class="btn btn-primary">GET</button>
<button class="btn btn-danger">POST</button>
<button class="btn btn-info">通用方法ajax</button>
</div>
<script>
$('button').eq(2).click(function(){
$.ajax({
//请求url
url: 'http://localhost:xxx/jquery-server',
//请求参数
data: {a:100,b:200},
//请求类型
type: 'POST',
//响应体结果设置
dataType: 'json',
//成功的回调函数
success: function(data){
console.log(data);
},
//超时时间
timeout: 2000,
//失败的回调函数
error: function(){
console.log("请求超时!!!");
}
})
})
</script>
</body>
</html>
服务端
all任何请求类型都可以接收
app.post('/jquery-server',(request,response)=>{
//设置响应头
response.setHeader('Access-Control-Allow-Origin','*');
const data = {name: 'xxx'};
// //定时器
setTimeout(() => {
response.send(JSON.stringify(data));
}, 1000);
});
fetch 发送 AJAX请求
前端
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>fetch 发送 AJAX请求</title>
</head>
<body>
<button>AJAX请求</button>
<script>
const btn = document.querySelector('button');
btn.onclick = function(){
fetch('http://localhost:xxx/fetch-server',{
//请求方法
method: 'POST',
//请求头
headers: {
name: 'xx'
},
//请求体
body: 'username=admin'
}).then(response=>{
return response.json();
}).then(response=>{
console.log(response);
})
}
</script>
</body>
</html>
服务端
//fetch服务
app.all('/fetch-server',(request,response)=>{
//设置响应头
response.setHeader('Access-Control-Allow-Origin','*');
response.setHeader('Access-Control-Allow-Headers','*');
const data = {name: 'xxx'};
// //定时器
setTimeout(() => {
response.send(JSON.stringify(data));
}, 1000);
});
XMLHttpRequest超时与网络异常请求
前端
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
#div1{
width: 300px;
height: 300px;
border: 1px solid red;
}
</style>
</head>
<body>
<div id="div1">
</div>
<button>点我发送请求</button>
<script>
const btn = document.getElementsByTagName('button')[0];
const result = document.getElementById('div1');
//绑定事件
btn.addEventListener("click",function(){
//1.创建对象
const xhr = new XMLHttpRequest();
//超时设置
xhr.timeout = 2000;
//超时回调
xhr.ontimeout = function(){
alert("网络异常,请稍后重试!!!");
}
//网络异常回调
xhr.onerror = function(){
alert("你的网络似乎出了一些问题!");
}
//2.初始化 设置请求方法和url
xhr.open('GET',"http://localhost:xxx/delay");
//设置请求头
//Content-Type 设置请求体内容的类型
xhr.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
//3.发送
xhr.send();
//4.事件绑定
xhr.onreadystatechange = function(){
//判断
if(xhr.readyState==4){
//判断响应状态码
if(xhr.status >= 200 && xhr.status < 300){
//处理服务器端结果 行 头 空行 体
//1.响应行
result.innerHTML = xhr.response;//响应体
}
}
}
})
</script>
</body>
</html>
服务端
//延迟响应
app.all('/delay',(request,response)=>{
//设置响应头
response.setHeader('Access-Control-Allow-Origin','*');
response.setHeader('Access-Control-Allow-Headers','*');
//定时器
setTimeout(() => {
response.send("延迟响应");
}, 1000);
});
express使用配置
//1.引入express
const express = require('Express');
//2.创建应用对象
const app = express();
//3.服务器端代码
//4.监听端口启动服务(端口号)
app.listen(xxx,()=>{
console.log("服务器已经启动,xxx端口监听中");
})