Ajax 可以实现页面无刷新更新数据 应用场景 1.页面上拉加载更多数据 2.列表数据无刷新分页 3.表单项离开焦点数据验证 4.搜索框提示文字下拉列表 运行环境 需要运行在网站环境中才能生效,会使用node创建的服务器作为网站服务器 运行原理 实现步骤 1.创建ajax对象 var xhr = newXMLHttpRequest(); 2.告诉ajax请求地址以及请求方式 xhr.open('get','http://localhost:3000/xxx') (1).请求方式 (2).请求地址 3.发送请求 xhr.send(); 4.获取服务器端给与客户端的响应数据 xhr.onload =function () { xhr.responseText } 服务器端响应的数据格式 大多数情况下会以json对象作为响应数的格式 JSON.parse(); 将JSON字符串转换为JSON对象 请求参数传递 get请求方式 xhr.open('get','http://localhost:3000/get?a=1&b=2') post请求方式 xhr.setRequestHeader('Content-Type','application/x-www-form-urlencoded') xhr.send(params) 请求参数的格式 1.application/x-www-form-urlencoded 2.application/json 在请求头中指定Content-Type 属性的值是 application/json,告诉服务器端当前请求参数的格式是 json JSON.stringify()// 将json对象转换为json字符串 注意:get 请求是不能提交 json 对象数据格式的,传统网站的表单提交也是不支持 json 对象数据格式的 AJax状态码 0:请求为初始化(还没有条用open()) 1:请求以及建立,但是还没有发送(还没有条用open()) 2:请求已经发送 3:请求正在处理中,通常响应中已经有部分数据可以用了 4:响应已经完成,可以获取并使用服务器的响应了 xhr.readyState // 获取Ajax 状态码 onreadystatechange事件 当 Ajax 状态码发生变化时将自动触发该事件 在事件处理函数中可以获取Ajax 状态码并对其进行判断,当状态码为 4 时就可以通过xhr.responseText 获取服务器端的响应数据了. // 当Ajax状态码发生变化时 xhr.onreadystatechange = function () { // 判断当Ajax状态码为4时 if (xhr.readyState == 4) { // 获取服务器端的响应数据 console.log(xhr.responseText); } } Ajax错误处理 1.网络畅通,服务器端能接收到请求,服务器端返回的结果不是预期结果。 可以判断服务器打断返回的状态码,分别进行处理,xhr.status获取http状态码 2.网络畅通,服务器端没有接收到请求,返回404状态码。 检查请求地址是否错误 3.网络畅通,服务器端能接收到请求,服务器端返回500状态码。 服务器端错误,找后端程序员进行沟通。 4.网络中断,请求无法发送到服务器端。 会触发xhr对象下面的onerror事件,在onerror事件处理函数中对错误进行处理 缓存问题 xhr.open('get','http://localhost3000/cache?t='+ Math.random()) Ajax异步编程 可以用解构 的方法传递形参 用对象的方法传递实参 Object.assign(object1,object2) 混合写法,传递两个中间没有的,相同的就近原则 客户端模板引擎 作用:使用模板引擎提供的模板语法,可以将数据和HTML拼接起来 1.下载art-template模板引擎库文件并在 HTML 页面中引入库文件 <scriptsrc="./js/template-web.js"></script> 2.准备 art-template 模板 <script id="tpl"type="text/html"> <div class="box"></div> </script> 3.告诉模板引擎将哪一个模板和哪个数据进行拼接 (模板id){对象,要在模板中展现的数据} var html = template('tpl', {username:'zhangsan', age: '20'}); 4.将拼接好的html字符串添加到页面中 document.getElementById('container').innerHTML = html; 5.通过模板语法告诉模板引擎,数据和html字符串要如何拼接` <script id="tpl"type="text/html"> <div class="box"> {{username }} </div> </script> 验证邮箱地址唯一性 1.获取文本框并为其添加离开焦点事件 2.离开焦点是,检测用户输入的邮箱地址是否符合规则 3.如果不符合规则,阻止程序需向下执行并给出提示信息 4.向服务器发送请求,检则邮箱地址是否被别人注册 5.根据服务器端返回值确定客户端显示何种提示信息 搜索框内容自动提示 1.获取搜索框并为其添加用户输入事件oninput 2.获取用户输入的关键字 3.向服务器端发送请求并携带关键字作为请求参数 4.将响应数据显示在搜索框底部 5.为了避免请求发送过于频繁需要添加定时器 FormData 对象的作用 1.模拟HTML表单,相当于将HTML表单映射成表单,自动将表单对象中的数据拼接成请求参数的格式。 2.异步上传二进制文件 使用 1.准备HTML表单 2.将HTML表单转化为formData对象(必须给表单添加一个name属性)(给form添加一个id)(如果需要打印的话,直接打印不出来,需要使用formData.get(username)获取) 3.提交表单对象 xhr.send(formData) formData对象的实例方法 1.获取表单对象中属性的值 formData.get(''); 2.设置值表单对象中属性的值 formData.set('username','zhangsan')不端输入什么,输出的结果都是zhangsan 如果设置的表单属性不存在,将会创建在这个属性,如果属性存在,将改变属性的值 3.删除表单对象中属性的值 formData.delete('username') 4.向表单对象中追加属性值 formData.append('username','value') set方法与append方法区别:在属性名已存在的情况下,set 会覆盖已有键名的值,append会保留两个值。 FormData二进制文件上传 var file = document.getElementById('file') // 当用户选择文件的时候 file.onchange = function () { // 创建空表单对象 var formData = new FormData(); // 将用户选择的二进制文件追加到表单对象中 formData.append('attrName', this.files[0]); // 配置ajax对象,请求方式必须为post xhr.open('post', 'www.example.com'); xhr.send(formData); } FormData文件上传进度展示 // 当用户选择文件的时候 file.onchange = function () { // 文件上传过程中持续触发onprogress事件 xhr.upload.onprogress = function (ev) { // 当前上传文件大小(loaded)/文件总大小(total) 再将结果转换为百分数 // 将结果赋值给进度条的宽度属性 bar.style.width = (ev.loaded / ev.total) *100 + '%'; } } FormData文件上传图片计时预览 xhr.onload = function () { var result = JSON.parse(xhr.responseText); var img = document.createElement('img'); img.src = result.src; img.onload = function () { document.body.appendChild(this); } } Ajax请求限制 只能向自己的服务器发送请求 什么是同源 如果两个页面拥有相同的协议,域名和端口,那么这两个页面就属于同一个源,其中只要有一个不相同,就是不同源 使用JSONP解决同源限制问题 原理:script标签可以跨域 只能用于发送get请求,不能发送post请求 jsonp是json padding的缩写,他不属于Ajax请求,但他可以模拟Ajax请求 1.将不同源的服务器端请求地址写在script标签的src属性中 <scriptsrc="www.example.com"></script> <scriptsrc=“https://cdn.bootcss.com/jquery/3.3.1/jquery.min.js"></script> 2.服务器端响应数据必须是一个函数的调用,真正要发送给客户端的数据需要作为函数调用的参数。 const data = 'fn({name: "张三", age: "20"})'; res.send(data); 3.在客户端全局作用域下定义函数 fn。 function fn (data){ } 4.在fn函数内部对服务器端返回的数据进行处理。 function fn (data){ console.log(data); } JSONP代码优化 1.客户端需要将函数名称传递到服务器端 2.将script请求的发送变成动态请求 3.封装jsonp函数,方便请求发送 CORS跨域资源共享 * 允许所有的客户端访问我 跨域解决方法: j1.sonp不安全,不建议使用 2.cors比较安全, 3.代理 cookie是默认不能跨域的 Access-Control-Allow-Origin:'http://localhost:3000' Access-Control-Allow-Origin: '*' ####withCredentials属性 在使用Ajax技术发送跨域请求时,默认情况下不会在请求中携带cookie信息。 withCredentials:指定在涉及到跨域请求时,是否携带cookie信息,默认值为false Access-Control-Allow-Credentials:true 允许客户端发送请求时携带cookie
|