文章目录
1.AJAX 简介
AJAX 全称为 Asynchronous JavaScript And XML,就是异步的 JS 和 XML。
通过 AJAX 可以在浏览器中向服务器发送异步请求,最大的优势就是:无刷新获取数据。
AJAX 不是新的编程语言,而是一种将现有的标准组合在一起使用的新方式。
2.XML 简介
XML :可扩展标记语言
XML 被设计用来传输和存储数据。
XML 和 HTML 类似,不同的是 HTML 中都是预定义标签 , 而 XML 中没有预定义标签,都是自定义标签,用来表示一些数据。
比如:
<person>
<name>xy</name>
<age>21</age>
</person>
不过现在已被JSON替代。
3. AJAX 的特点
3.1 优点
- 可以不需要刷新页面就可以与服务端进行通信
- 允许你根据用户事件来更新部分页面内容
3.2 缺点
- 没有浏览历史,不能回退
- 存在跨域问题
- SEO(搜索引擎优化) 不友好,动态创建的数据爬虫爬不到
4. AJAX 的使用
4.1 核心对象
XMLHttpRequest: 核心对象
AJAX的所有操作都是通过该对象进行的
4.2 使用步骤
1.创建 XMLHttpRequest对象
vat xhr=new XMLHttpRequest();
2.设置请求信息
xhr.open(method,url);
//可以设置请求头,一般不设置
//url:可通过?&a=100&b=100传递参数
3.发送请求
xhr.send(body)
//get 请求不传 body 参数,只有 post
4.接收响应
//xhr.responseXML 接收 xml 格式的响应数据
//xhr.responseText 接收文本格式的响应数据
xhr.onreadystatechange = function (){
//xhr.readyState == 4:判断服务端是否返回了全部结果
if(xhr.readyState == 4){
if(xhr.status >= 200 && xhr.status < 300){
var text = xhr.responseText;
console.log(text);
}
}
}
延申:
onreadystatechange:由on 、readyState、change组成1.on:当…的时候
2.readyState:xhr对象中的一个属性,表示状态。有5个取值:0 1 2 3 40: 未初始化
1:open方法调用完毕,仍然可以使用 setRequestHeader(),设定 HTTP请求的头信息。
2:send方法调用完毕,并且头信息和状态码已经收到
3:服务端返回了部分结果
4:服务端返回了所有的结果,或者本次接收已经失败了3.change:改变,表示0-4状态改变
4. 案例(GET 请求)
需求:
通过GET.html向server.js发送GET请求,获取响应体,并显示在div中
分析:
GET.html:通过ajax发送请求
server.js:express框架模拟服务端
代码:
GET.html
<!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>Ajax GET 请求</title>
<style>
div {
width: 100px;
height: 100px;
background: pink;
}
</style>
</head>
<body>
<button>发送请求</button>
<div></div>
<script>
let btn = document.querySelector('button');
let res = document.querySelector('div');
btn.addEventListener('click', function () {
// 1.创建xhr对象
const xhr = new XMLHttpRequest();
// 2.open
xhr.open('GET', 'http://localhost:8000/server');
// 3.发送
xhr.send();
// 4.事件绑定 处理服务端返回的结果
xhr.onreadystatechange = function () {
// 判断状态是否返回了所有结果
if (xhr.readyState == 4) {
//判断响应状态码 200-300之间
if (xhr.status >= 200 && xhr.status < 300) {
console.log(xhr.status);//状态码
console.log(xhr.statusText);//状态字符串
console.log(xhr.getAllResponseHeaders());//所有响应头
console.log(xhr.response);//响应体
res.innerHTML = xhr.response;
}
}
}
})
</script>
</body>
</html>
server.js
// 1.引入express
const express = require('express');
// 2.创建应用对象
const app = express();
// 3.创建路由规则(GET方法)
app.get('/server', (request, response) => {
// request 是对请求报文的封装
// response 是对响应报文的封装
// 设置响应头 设置允许跨域
response.setHeader('Access-Control-Allow-Origin', '*');
// 设置响应体
response.send('hello express');
});
// 4.监听端口启动服务
app.listen(8000, () => {
console.log('服务已经启动,8000端口监听中...');
})
结果:
显示:
控制台打印:
标头:
5. 案例(POST请求)
需求:
通过POST.html向server.js发送GET请求,获取响应体,并显示在div中
分析:
POST.html:通过ajax发送请求
server.js:express框架模拟服务端
代码:
POST.html
<!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>Ajax GET 请求</title>
<style>
div {
width: 100px;
height: 100px;
background: pink;
}
</style>
</head>
<body>
<button>发送请求</button>
<div></div>
<script>
let btn = document.querySelector('button');
let res = document.querySelector('div');
btn.addEventListener('click', function () {
// 1.创建xhr对象
const xhr = new XMLHttpRequest();
// 2.open
xhr.open('POST', 'http://localhost:8000/server');
// 3.发送(可任意写法)
xhr.send('a=100&b=100');
// 4.事件绑定 处理服务端返回的结果
xhr.onreadystatechange = function () {
// 判断状态是否返回了所有结果
if (xhr.readyState == 4) {
//判断响应状态码 200-300之间
if (xhr.status >= 200 && xhr.status < 300) {
console.log(xhr.status);//状态码
console.log(xhr.statusText);//状态字符串
console.log(xhr.getAllResponseHeaders());//所有响应头
console.log(xhr.response);//响应体
res.innerHTML = xhr.response;
}
}
}
})
</script>
</body>
</html>
server.js
// 1.引入express
const express = require('express');
// 2.创建应用对象
const app = express();
// 3.创建路由规则(POST方法)
app.post('/server', (request, response) => {
// request 是对请求报文的封装
// response 是对响应报文的封装
// 设置响应头 设置允许跨域
response.setHeader('Access-Control-Allow-Origin', '*');
// 设置响应体
response.send('hello express POST');
});
// 4.监听端口启动服务
app.listen(8000, () => {
console.log('服务已经启动,8000端口监听中...');
})
结果:
显示:
控制台打印:
标头:
请求负载
6. 解决IE缓存
问题:在一些浏览器中(IE),由于缓存机制的存在,ajax 只会发送的第一次请求,剩余多次请求不会在发送给浏览器而是直接加载缓存中的数据。
解决方式:浏览器的缓存是根据 url 地址来记录的,所以我们只需要修改 url 地址即可避免缓存问题
xhr.open(“get”,"/testAJAX?t="+Date.now())