🥇 所有请求均已异步请求方式
🥇 AJAX 简介
AJAX 全称为Asynchronous Javascript And XML,就是异步的 JS 和 XML。
通过AJAX可以在浏览器中向服务器发送异步请求,最大的优势:无刷新获取数据。
AJAX 不是新的编程语言,不是新的一门独立的技术,而是一种使用现有标准的新方法。
🥇 AJAX 的工作原理
Ajax的工作原理相当于在用户和服务器之间加了一个中间层(Ajax引擎),使用户操作与服务器响应异步化。
🥇 AJAX 的特点
🥈 AJAX 的优点
可以无需刷新页面而与服务器端进行通信。
允许你根据用户事件来更新部分页面内容。
🥈 AJAX 的缺点
🥇 AJAX 的使用
🥈 Ajax 的实现
function ajax(url, methods, body, headers) {
return new Promise((resolve, reject) => {
let req = new XMLHttpRequest();
req.open(methods, url);
for (let key in headers) {
req.setRequestHeader(key, headers[key]);
}
req.onreadystatechange = () => {
if (req.readystate == 4) {
if (req.status >= '200' && req.status <= 300) {
resolve(req.responeText);
} else {
reject(req);
}
}
};
req.send(body);
});
}
🥈 核心对象
XMLHttpRequest,AJAX的所有操作都是通过该对象进行的。
🥈 使用步骤
创建XMLHttpRequest对象
var xhr = new XMLHttpRequest();
设置请求信息
xhr.open(method, url);
//可以设置请求头,一般不设置 post 必须设置请求头
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
发送请求
xhr.send(body) //get请求不传body参数,只有post请求使用
接收响应
//xhr.responseXML 接收xml格式的响应数据
//xhr.responseText 接收文本格式的响应数据
xhr.onreadystatechange = function (){
if(xhr.readyState === 4 && xhr.status === 200){
var text = xhr.responseText;
console.log(text);
}
}
🥈 AJAX 请求状态
xhr.readyState 可以用来查看请求当前的状态
1. 对应常量UNSENT,表示XMLHttpRequest实例已经生成,但是open()方法还没有被调用。
2. 对应常量OPENED,表示send()方法还没有被调用,仍然可以使用setRequestHeader(),设定HTTP请求的头信息。
3. 对应常量HEADERS_RECEIVED,表示send()方法已经执行,并且头信息和状态码已经收到。
4. 对应常量LOADING,表示正在接收服务器传来的body部分的数据,如果responseType属性是text或者空字符串,responseText就会包含已经收到的部分信息。
5. 对应常量DONE,表示服务器数据已经完全接收,或者本次接收已经失败了
🥇 解决IE缓存问题
问题:在一些浏览器中(IE),由于缓存机制的存在,ajax只会发送的第一次请求,剩余多次请求不会在发送给浏览器而是直接加载缓存中的数据。
解决方式:浏览器的缓存是根据url地址来记录的,所以我们只需要修改url地址即可避免缓存问题
// 在 URL 后边加上一个时间,每次请求的 url 地址不一样时 就会避免IE缓存
xhr.open("get","/testAJAX?t="+Date.now());
🥇 jQuery 中的AJAX
🥈 get 请求
$.get(url, [data], [callback], [type])
1. url:请求的URL地址。
2. data:请求携带的参数。
3. callback:载入成功时回调函数。
4. type:设置返回内容格式,xml, html, script, json, text, _default。
$.ajax({
url: 'https://www.baidu.com',
method: 'get',
data: {
name: 'chen',
age: 25
},
success: function (result) {
console.log(result);
},
error: function (err) {
console.log(err);
}
})
// 精简版
$.get(
'https://www.baidu.com', {
name: 'chen',
age: 25
},
(data) => {
console.log(data);
}
)
🥈 post 请求
$.post(url, [data], [callback], [type])
1. url:请求的URL地址。
2. data:请求携带的参数。
3. callback:载入成功时回调函数。
4. type:设置返回内容格式,xml, html, script, json, text, _default。
🥈 封装 AJAX
function myAjax(option) {
let {
url,
method,
data,
success,
error
} = option;
// 实例化 xhr
let xhr = new XMLHttpRequest();
// 绑定监听
xhr.onreadystatechange = function () {
if (xhr.readyState !== 4) {
return
}
if (xhr.status >= 200 && xhr.status <= 299) {
if (success) success(xhr.response)
} else {
if (error) error('请求出错')
}
}
// 整理参数
let str = ''
for (let key in data) {
str += `${key}=${data[key]}&`
}
//根据请求方式决定如何携带参数
if (method.toUpperCase() === 'GET') {
xhr.open(method, url + '?' + str)
xhr.send()
} else {
xhr.open(method, url)
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded')
xhr.send(str)
}
return xhr
}
🥇 跨域问题
🥈 JSONP
关于 jsonp 解决跨域
1. 原理:利用了script标签发请求不受同源策略的限制。所以不会产生跨域问题
2. 套路:动态构建script节点,利用节点的src属性,发出get请求,从而绕开ajax引擎
3. 弊端:(1).只能解决get请求跨域的问题。(2).后端工程师必须配合前端
4. 备注:有这样一种感觉:前端定义函数,后端“调用”。后端返回的数据,前端以js格式解析,并且运行。
// JSONP 跨域 - 客户端
jsonp.addEventListener('click', () => {
// 提前定义好一个被调用的函数
window.fun = function (data) {
console.log(data);
}
// 创建一个 script 节点
const scriptNode = document.createElement('script');
// 为节点指定 src 地址,同时指定好回调函数的名字
scriptNode.src = 'http://localhost:3000/?callback=fun'
// 将节点插入页面
document.body.appendChild(scriptNode)
})
// JSONP 跨域 - 服务端
app.get('/', function (request, response) {
// 接收客户端传过来的数据 获得回调函数并结构赋值获得回调函数的名称
let {
callback
} = request.query;
// 要返回客户端的数据
let personArr = [{
name: 'chen',
age: 25
}]
// 将准备好的数据 利用回调函数返回给客户端
response.send(`${callback}(${JSON.stringify(personArr)})`)
})
🥈 CORS
cors 解决跨域问题只需要在服务端代码中加入一行代码即可
app.use((request, response, next) => {
response.set('Access-Control-Allow-Origin', '*') // * 原意为可以通过的请求地址 * 表示所有请求都可以通过
next();
})