Ajax(Asynchronous JavaScript And XML)传统web交互使用户触发一个http请求,服务器接收到请求之后,响应到用户,返回一个新页面;AJAX是一种用于创建快速动态网页的技术,通过在后台与服务器进行少量数据交换,AJAX 可以使网页实现异步更新。 异步与同步JS是单线程语言, 同步 代码会从上到下执行,如果中间某一段代码执行时间较长,后面的代码必须等待前面执行完,才能执行。JS 对于这种场景就设计了异步,JS代码执行的机制是将遇到的异步代码放到 异步队列 中,执行完所有同步代码后,异步代码再出队列执行。 优点和不足优点 不需要插件支持(一般浏览器且默认开启 JavaScript 即可) 用户体验极佳(不刷新页面即可获取可更新的数据) 提升 Web 程序的性能(在传递数据方面做到按需放松,不必整体提交) 减轻服务器和带宽的负担(将服务器的一些操作转移到客户端)
不足 不同版本的浏览器度 XMLHttpRequest 对象支持度不足(比如 IE5 之前) 前进、后退的功能被破坏(因为 Ajax 永远在当前页,不会记录前后页面) 3.搜索引擎的支持度不够(因为搜索引擎爬虫还不能理解 JS 引起变化数据的内容)
Ajax交互准备页面请求,创建XMLHttpRequest对象 let xhr = new XMLHttpRequest(); 使用XMLHttpRequest对象的open()和send()方法发送请求 /**open()有三个参数
*@param {string} method 提交方法
*@param {string} url 提交地址
*@param {boolean} true 是否异步,默认为异步,一般不设置
*/
//get提交
xhr.open('get','url?id=1');
//send()方法参数里放request body里面的携带的值
xhr.send()//get方法提交不传参
//post提交
xhr.open('post','url');
//设置enctype
xhr.setRequestHeader("Content-type","application/x-www-form-urlencoded");
//发送请求信息
xhr.send('id=1'); onreadystatechange函数,状态改变时发送数据回客户端,使用 XMLHttpRequest对象的responseText或responseXML属性获得服务器的响应 xhr.onreadystatechange = function(){
//判断状态是否为完成响应
if(xhr.readyState == 4){
//判断返回值是否正确
if (xhr.status == 200) {
console.log(xhr.responseText);
}
}
} 1** 请求收到,继续处理 2** 操作成功收到,分析、接受 3** 完成此请求必须进一步处理 4** 请求包含一个错误语法或不能完成 5** 服务器执行一个完全有效请求失败 100——客户必须继续发出请求 101——客户要求服务器根据请求转换HTTP协议版 200——交易成功 201——提示知道新文件的URL 202——接受和处理、但处理未完成 203——返回信息不确定或不完整 204——请求收到,但返回信息为空 205——服务器完成了请求,用户代理必须复位当前已经浏览过的文件 206——服务器已经完成了部分用户的GET请求 300——请求的资源可在多处得到 301——删除请求数据 302——在其他地址发现了请求数据 303——建议客户访问其他URL或访问方式 304——客户端已经执行了GET,但文件未变化 305——请求的资源必须从服务器指定的地址得到 306——前一版本HTTP中使用的代码,现行版本中不再使用 307——申明请求的资源临时性删除 400——错误请求,如语法错误 401——请求授权失败 402——保留有效ChargeTo头响应 403——请求不允许 404——没有发现文件、查询或URl 405——用户在Request-Line字段定义的方法不允许 406——根据用户发送的Accept拖,请求资源不可访问 407——类似401,用户必须首先在代理服务器上得到授权 408——客户端没有在用户指定的饿时间内完成请求 409——对当前资源状态,请求不能完成 410——服务器上不再有此资源且无进一步的参考地址 411——服务器拒绝用户定义的Content-Length属性请求 412——一个或多个请求头字段在当前请求中错误 413——请求的资源大于服务器允许的大小 414——请求的资源URL长于服务器允许的长度 415——请求资源不支持请求项目格式 416——请求中包含Range请求头字段,在当前请求资源范围内没有range指示值,请求也不包含If-Range请求头字段 417——服务器不满足请求Expect头字段指定的期望值,如果是代理服务器,可能是下一级服务器不能满足请求 500——服务器产生内部错误 501——服务器不支持请求的函数 502——服务器暂时不可用,有时是为了防止发生系统过载 503——服务器过载或暂停维修 504——关口过载,服务器使用另一个关口或服务来响应用户,等待时间设定值较长 505——服务器不支持或拒绝支请求头中指定的HTTP版本
浏览器同源策略浏览器安全策略,保障非同源资源之间数据访问的安全性,默认不允许非同源的资源直接访问。 URL:协议://域名:端口/路径名称?查询字符串#位置标识符 同源:协议、域名、端口完全一致,只要三个中有任何一个不一致,则是非同源。非同源资源间需要进行访问,则需要实现跨域。 跨域CORS(cross-origin resource sharing,跨域资源共享) 只需在服务器端设置响应头信息:Access-Control-Allow-Origin:*,如 header("Access-Control-Allow-Origin:*"); //php jsonp 利用<script>在引入外部JS时不受同源策略限制的特性,来实现跨域。(src的开放性原则) JSONP只能处理GET请求方式的跨域 function jsonp(url, fn, query) {
let str = '';
//拼接回调函数参数
url += `?cb=${fn}`;
if (query) {
//拼接其他函数
for (let key in query) {
str += `&${key}=${query[key]}`;
}
}
//参数拼接在url后面
url += str;
//创建一个script
const script = document.createElement("script");
//设置src
script.src = url;
//将script渲染到页面
document.body.appendChild(script);
//请求后移除script
document.body.removeChild(script);
} proxy(代理) 通过当前服务器访问跨域的服务器 初始化 npm init 全局安装gulp npm i gulp -g 本地下载gulp包 npm i gulp --save-dev 本地下载http-proxy-middleware包 npm i http-proxy-middleware -dev
const proxy = require('http-proxy-middleware') //指定任务 // 原请求方式:$.get('http://localhost:80/api/login.php') const server = () => { connect.server({ port: 8081, //自定义端口 root: 'dist', //端口根目录 livereload: true, // 中间件:指的是在请求响应过程当中做一些处理 // 是一个函数,返回值是一个数组,在数组里配置代理跨域 middleware () { return [ // 将前端请求以/api开头的代理到后端端口 proxy('/api', { target: 'http://localhost:80', //请求的后端端口 changeOrigin: true }) ] } }) } ``` promise(ES6)承诺:兑现(resolve)或 失信(rejected) 这个对象有三种状态:Pending(进行中)、Resolved(已完成,又称 Fulfilled)和 Rejected(已失败)。只有异步操作的结果,可以决定当前是哪一种状态,任何其他操作都无法改变这个状态。这也是 Promise 这个名字的由来,它的英语意思就是「承诺」,表示其他手段无法改变。 new Promise((resolve, reject) => {
var xhr = new XMLHttpRequest()
xhr.open('get', './06.php?id=5')
xhr.send()
xhr.onreadystatechange = function () {
if (xhr.readyState === 4) {
if (xhr.status === 200) {
// resolve只能传一个参数,如果要传递多个参数,使用对象
resolve(xhr.responseText, 5)
} else {
reject()
}
}
}
}).then((resp, num) => {
console.log(resp)
console.log(num) // undefined
}).catch(() => {
console.log('网络错误')
}) by:逆战班 陈亮
|