A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 我在夏天 初级黑马   /  2019-8-19 08:37  /  670 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

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

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马