什么是Ajax?
Ajax能够在不重新加载整个页面的情况下与服务器交换数据并更新部分网页内容,实现局部刷新,大大降低了资源的浪费,是一门用于快速创建动态网页的技术。
实现步骤:
1、创建XMLHttpRequest
对象var xhr = new XMLHttpRequest();
2、向服务器发送请求,使用xmlHttpRequest对象的open
和send
方法;
3、监听状态变化(onreadystatechange
),执行相应回调函数
4、判断readyState
和status
属性
//用XMLHttpRequest创建Ajax异步对象
var xhr = new XMLHttpRequest()
//设置请求参数(请求方式 请求页面相对路径 是否异步)
xhr.open('get','/API')
//调用send方法,这个方法可以设定需要发送的报文主体
xhr.send()
// 监听readystatechange事件
xhr.onreadystatechange = function(){
// 获取异步对象的readyState 属性,每当 readyState 改变时,onreadystatechange 函数就会被执行。readyState值为4说明响应内容解析完成,可以在客户端调用
if (xhr.readyState === 4){
// 用status属性判断响应报文的状态,若为200说明服务器正常运行并返回了响应数据。
if (xhr.status === 200){
// 读取响应数据,可以通过 responseText 属性来取回由服务器返回的数据。
console.log(xhr.responseText);
}
}
}
ajax返回的状态:
0 - (未初始化)还没有调用send()方法
1 - (载入)已调用send()方法,正在发送请求
2 - (载入完成)send()方法执行完成,已经接收到全部响应内容
3 - (交互)正在解析响应内容
4 - (完成)响应内容解析完成,可以在客户端调用了.如果调用xhr.onload = function()
{},进入函数时readyState的值已经变为4
Ajax函数封装
function ajax (options) {
// 默认值
var defaults = {
type: 'get',
url: '',
async: true,
data: {},
header: {
'Content-Type': 'application/x-www-form-urlencoded'
},
success: function () {},
error: function () {}
}
// 使用用户传递的参数替换默认值参数
Object.assign(defaults, options);
// 创建ajax对象
var xhr = new XMLHttpRequest();
// 参数拼接变量
var params = '';
// 循环参数
for (var attr in defaults.data) {
// 参数拼接
params += attr + '=' + defaults.data[attr] + '&';
// 去掉参数中最后一个&
params = params.substr(0, params.length-1)
}
// 如果请求方式为get
if (defaults.type == 'get') {
// 将参数拼接在url地址的后面
defaults.url += '?' + params;
}
// 配置ajax请求
xhr.open(defaults.type, defaults.url, defaults.async);
// 如果请求方式为post
if (defaults.type == 'post') {
// 设置请求头
xhr.setRequestHeader('Content-Type', defaults.header['Content-Type']);
// 如果想服务器端传递的参数类型为json
if (defaults.header['Content-Type'] == 'application/json') {
// 将json对象转换为json字符串
xhr.send(JSON.stringify(defaults.data))
}else {
// 发送请求
xhr.send(params);
}
} else {
xhr.send();
}
// 请求加载完成
xhr.onload = function () {
// 获取服务器端返回数据的类型
var contentType = xhr.getResponseHeader('content-type');
// 获取服务器端返回的响应数据
var responseText = xhr.responseText;
// 如果服务器端返回的数据是json数据类型
if (contentType.includes('application/json')) {
// 将json字符串转换为json对象
responseText = JSON.parse(responseText);
}
// 如果请求成功
if (xhr.status == 200) {
// 调用成功回调函数, 并且将服务器端返回的结果传递给成功回调函数
defaults.success(responseText, xhr);
} else {
// 调用失败回调函数并且将xhr对象传递给回调函数
defaults.error(responseText, xhr);
}
}
// 当网络中断时
xhr.onerror = function () {
// 调用失败回调函数并且将xhr对象传递给回调函数
defaults.error(xhr);
}
}