目录
一、Ajax基础
1.1 传统网站中存在的问题
1.2 Ajax概述
1.3 Ajax的应用场景
1.4 Ajax的运行环境
二、Ajax 运行原理及实现
2.1 Ajax 运行原理
2.2 Ajax的实现步骤
2.3 服务器端响应的数据格式
2.4 请求参数传递
GET请求方式
POST请求方式(必须设置)
2.5 请求报文
2.6 请求参数的格式
2.7 获取服务端器的响应
Ajax状态码
onreadystatechange 事件
两种获取服务器端响应方式的区别
2.8 Ajax错误处理
2.9 低版本IE浏览器的缓存问题
1) 创建Ajax对象
var xhr = new XMLHttpRequest();
2) 告诉Ajax请求地址以及请求方式
xhr.open('get','http://www.example.com');
3) 发送请求
xhr.send();
4) 获取服务器端与客户端的相应数据
xhr.onload = function() {
console.log(xhr.responseText);
}
如何获取:由于请求受网络速度快慢的影响,是需要一定的时间才能完成,这个时间是一个不确定的值,所以不能直接在send方法的后面直接获取请求的结果,我们需要为小xhr对象下的onload事件添加事件处理函数,当服务器端对客户端做出了响应,浏览器就会自动调用xhr下的onload事件对应的事件处理函数,在事件处理函数当中就可以获取服务端响应给客户端的数据。
例子:
1)创建一个名字为server的文件夹,在该文件夹下创建一个名为public的文件夹,然后在server下创建app.js并在其中写入以下代码
//app.js
//引入express框架
const express = require('express');
//路径处理模块
const path = require('path');
//创建web服务器
const app = express();
//静态资源访问服务功能
app.use(express.static(path.join(__dirname, 'public')));
//监听端口
app.listen(3000);
//控制台提示输出
console.log('服务器启动成功');
2)开启服务器
也可在vscode的终端中执行命令nodemon app.js,即在vscode中找到所要运行的js文件,右键点击该js文件的上一级文件,找到“在集成终端中打开”这一命令,点击后在终端中输入“nodemon app.js”命令
3)在public文件夹下创建一个html文件 (示例)
4)在app.js的app.use(express.static(path.join(__dirname, 'public')));这行代码下写入以下代码
// req 请求对象
// res 响应对象
// 01-html文件
app.get('/first', (req, res) => {
// 设置响应头 设置允许跨域
response.setHeader('Access-Control-Allow-Origin', '*')
res.send('Hello Ajax');
});
5)在html文件中右键点击使其在浏览器中运行,按下F12,打开Console,可看到输出的Hello Ajax
JSON.parse(); //将json字符串转换为json对象
示例:
html文件中
app.js文件中
app.get('/responseData', (req, res) => {
res.setHeader('Access-Control-Allow-Origin', '*');
res.send({ "name": "zs" });
});
xhr.open('get','http:zkjvbjhvb');
示例:
app.get('/get', (req, res) => {
res.setHeader('Access-Control-Allow-Origin', '*');
res.send(req.query);
// req.query 获取get请求的参数
});
xhr.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
//Content-Type:属性名称,
//application/x-www-form-urlencoded:属性值
xhr.send('name=zhangsan&age=20');
示例:
首先需在app.js文件中的路径处理模块的注释下写入
const bodyParser = require('body-parser');
app.use(bodyParser.urlencoded({ extended: false }))
app.use(bodyParser.json());
然后再在app.js的app.use(express.static(path.join(__dirname, 'public')));这行代码下写入
app.post('/post', (req, res) => {
res.setHeader('Access-Control-Allow-Origin', '*');
res.send(req.body);
});
报文详解可参考文章:ajax的解构请求方法以及报文_All rivers run in to the sea的博客-CSDN博客
1.application/x-www-form-urlencoded
name=zhangsan&age=20&sex=男
2.application/json
{name: 'zhangsan',age:'age',sex:'男'}
在请求头中指定Content-Type属性的值是application/json,告诉服务器端当前请求参数的格式json。
JSON.stringify()//将JSON对象转换为JSON字符串
注意:get请求是不能提交JSON对象数据格式的,传统网站的表单提交也是不支持JSON对象参与数据格式的
0:请求未初始化(还没有调用open()
1:请求已经建立,但是还没有发送(还没有调用send())
2:请求已经发送
3:请求正在处理中,通常响应中已经有部分数据可以用了
4:响应已经完成,可以获取并使用服务器的响应了
xhr.readyState //获取Ajax状态码
当Ajax状态码发生变化时将自动触发该事件。
区别描述 | onload事件 | onreadystatechange事件 |
是否兼容IE低版本 | 不兼容 | 兼容 |
是否需要判断Ajax状态码 | 不需要 | 需要 |
被调用次数 | 一次 | 多次 |
1. 网络畅通,服务器端能接收到请求,服务器请返回的结果不是预期结果。
可以判断服务器端返回的状态码,分别进行处理。xhr.status获取http状态码
2. 网络畅通,服务器端没有接收到请求,返回404状态码
检查请求地址是否错误
3. 网络畅通,服务器媲能接收到清求,服务器请可回500状态码。
服务器端错误,找后端程序员进行沟通
4. 网络中断,请求无法发送到服务器端
会触发xhr对象下面的onerror事件,在onerror事件处理函数中对错误进行处理。
问题:在低版本的IE测览器中,Ajax请求有产重的缓存问题,即在请求地址不发生变化的情况下,只有第一次请求会真正发送到报务器端,后续的请求都会从浏览器的缓存中获取结果,即使服务器端的数据更新了,客户端依然拿到的是缓存中的旧数据。