概述
浏览器提供的方法,可以实现页面无刷新更新数据,提高用户浏览网站应用的体验
应用场景
页面上拉加载更多数据列表数据无刷新分页表单项离开焦点数据验证搜索框提示文字下拉列表
运行环境
Ajax技术需要运行在网站环境中才能生效Node创建服务器,实现静态资源访问功能
const express
= require('express');
const path
= require('path');
const app
= express();
app
.use(express
.static(path
.join(__dirname
, 'public')));
app
.listen(3000);
console
.log('服务器启动成功');
Ajax 运行原理
Ajax的实现步骤
创建Ajax对象
var xhr
= new XMLHttpRequest();
告诉Ajax请求地址
xhr
.open('get', 'http://www.example.com');
发送请求
xhr
.send();
获取服务器给客户端的响应数据
xhr
.onload = function () {
console
.log(xhr
.reponseText
);
}
例:
客户端
var xhr
= new XMLHttpRequest();
xhr
.open('get', 'http://localhost:3000/first');
xhr
.send();
xhr
.onload = function () {
console
.log(xhr
.reponseText
);
}
服务器端
const express
= require('express');
const path
= require('path');
const app
= express();
app
.use(express
.static(path
.join(__dirname
, 'public')));
app
.get('/first', (req
, res
) => {
res
.send('Hello Ajax');
});
app
.listen(3000);
console
.log('服务器启动成功');
控制台输出:Hello Ajax
服务器端响应的数据格式
服务器端大多数情况下会以JSON对象作为响应数据的格式当客户端拿到响应数据时,要将JSO数据和HTML字符进行拼接,然后将拼接的结果展示在页面中在 http 请求与响应的过程中,无论时请求还是响应内容,如果是对象类型,最终都会被转换成对象字符串进行传输json 字符串转换为 json 对象
JSON.parse();
请求参数传递
GET请求
xhr
.open('get', 'http://www.example.com?name=XXX&age=20');
POST请求
xhr
.setRequestHeader('Context-Type', 'application/x-www-form-urlencoded');
xhr
.send('name=XXX&age=20');
运行原理及实现
请求报文:在HTTP请求和响应的过程中传递的数据块就是报文,包括要传送的数据和一些附加信息,这些数据和信息要遵守规定好的格式
请求参数的格式:application/x-www-form-urlencoded 或 application/json将JSON对象转换为JSON字符串
JSON.stringify();
get 请求是不能提交 JSON 对象数据格式的,传统网站的表单提交也是不支持 JSON 对象数据格式的
获取服务器端的响应
Ajax 状态码
0:请求未初始化(还没有调用 open())1:请求已经建立,但是还没有发送(还没有调用 send())2:请求已经发送3:请求正在处理中,通常响应中已经有部分数据可以用了4:响应已经完成,可以获取并使用服务器的响应了
获取 Ajax 状态码
获取 Ajax 状态码 shr.readyState();onreadystatechange 事件:当 Ajax状态码 发生变化时将自动触发该事件
两种方式的比较
区别onload 事件onreadystatechange 事件
是否兼容 IE 低版本不兼容兼容是否需要判断 Ajax 状态码不需要需要被调用次数一次多次执行效率高不高
Ajax 错误处理
网络畅通,服务器端能接收到请求,服务器端返回的结果不是预期结果
判断服务器端返回的状态码,分别进行处理 xhr.status();//获取http状态码
网络畅通,服务器端没有接收到请求,返回404状态码
检查请求地址是否错误
网络畅通,服务器端能接收到请求,服务器端返回500状态码
服务器端错误
网络中断,请求无法发送到服务器端
不会触发 xhr.onload 事件,会触发 xhr.onerror 事件,在 onerror 事件处理函数中对错误进行处理
低版本IE浏览器的缓存问题
问题: 在低版本的IE浏览器中,Ajax请求有严重的缓存问题,请求的地址不发生变化的情况下,只有第一次请求会真正发送到服务器,后续的请求都会从浏览器的缓存中获取结果。即使服务器端的数据更新了,客户端拿到的依然是缓存中的旧数据
解决方案: 在请求地址的后面加请求参数,保证每一次请求中的请求参数的值不相同 xhr.open('get', 'http://www.example.com?t=' + Math.random()); 或者 xhr.open('get', 'http://www.example.com?t=' + Date.now());
Ajax 封装
基本封装函数
function ajax(options
) {
var xhr
= new XMLHttpRequest();
xhr
.open(options
.type
, options
.url
);
xhr
.send();
xhr
.onload = function () {
optipns
.success(xhr
.reponseText
);
}
}
ajax({
type
:'get',
url
:'http://www.example.com',
sucess
:function(data
){
console
.log(data
);
}
});
带请求参数的封装函数
请求参数的位置问题: 将请求参数传递到 Ajax 函数内部,在函数内部根据请求方式的不同将请求参数放在不同的位置 注 get:放在请求地址的后面 post:放在 send 方法中请求参数的格式问题 application/x-www-form-urlencoded :参数名称=参数值&参数名称=参数值 application/json:{name: ‘zhangsan’, age:20}
function ajax(options
) {
var defaults
= {
type
: 'get',
url
: '',
data
: {},
header
: {
'Content-Typr': 'application/x-www-form-urlencoded'
},
sucess
: function () {],
error
: function () {}
};
Object
.assign(defaluts
, options
);
var xhr
= new XMLHttpRequest();
var params
= '';
for(var attr
in defaults
.data
) {
params
+= attr
+ '=' + defaults
.data
[attr
] + '&';
}
params
= params
.substr(0, params
.length
- 1);
xhr
.open(defaults
.type
, defaults
.url
);
if(defaults
.type
== 'post') {
var contentType
= defaults
.header
['Content-Type'];
xhr
.setRequestHeader('Content-Type', 'appllication/x-wwww-form-urlencoded');
if(ContentType
== 'application/json') {
xhr
.send(JSON.stringify(defaults
.data
));
} else {
xhr
.send(params
);
}
} else {
xhr
.send();
}
xhr
.send();
xhr
.onload = function () {
var contentType
= xhr
.getPesponseHeader('Content-Type');
var reponseText
= xhr
.reponseText
;
if(contentType
.includes('application/json')) {
reponseText
= JSON.parse(reponseText
);
}
if(xhr
.status
== 200) {
defaults
.sucess(xhr
.responseText
, xhr
);
} else {
v
.error(xhr
.reponseText
, xhr
);
}
}
}
ajax({
type
:'get',
url
:'http://www.example.com',
header
: {
'Content-Type':'x-www-form-unlencoded';
},
data
: {name
: 'zhangsan', age
: 20},
sucess
:function(data
, xhr
){
console
.log(data
);
},
error
:function(data
, xhr
){
}
});