🥇 所有请求均已异步请求方式
🥇 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;// 实例化 xhrlet 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();})
