0
点赞
收藏
分享

微信扫一扫

Ajax03-XMLHttpRequest技术,JSON对象,封装自己的ajax,同源策略&跨域解决,防抖&节流

老北京的热干面 2022-01-15 阅读 23

AjaxDay03

XMLHttpRequest

什么是 XMLHttpRequest?

是浏览器内置的一个构造函数

作用:基于 new 出来的 XMLHttpRequest 实例对象,可以发起 Ajax 的请求。
axios 中的 axios.get()、axios.post()、axios() 方法,都是基于 XMLHttpRequest(简称:XHR) 封装出来的!

使用 XMLHttpRequest 发起 GET 请求

get不携带参数

主要的 4 个实现步骤:

  1. 创建 xhr 对象

  2. 调用 xhr.open() 函数

  3. 调用 xhr.send() 函数

  4. 监听 load 事件

在这里插入图片描述

get携带带参数

可以在请求的 URL 地址后面通过 ? 的形式携带查询参数。示例代码如下:

在这里插入图片描述

使用 XMLHttpRequest 发起 POST 请求

携带查询参数

在这里插入图片描述

携带请求体参数

当需要携带请求体数据时,需要进行额外的两步操作:

  1. 在 xhr.open() 之后,调用 xhr.setRequestHeader() 函数,指定请求体的编码格式

  2. 在 xhr.send() 中,指定要提交的请求体数据

在这里插入图片描述

数据交换格式

数据交换格式,就是服务器端与客户端之间数据传输的格式,现在主要使用JSON交换格式

在这里插入图片描述

把 JSON 数据转换为 JS 数据

调用浏览器内置的 SON.parse() 函数,可以把 JSON 格式的字符串转换为 JS 数据,例如:

在这里插入图片描述

把 JS 数据转换为 JSON 数据

调用浏览器内置的 JSON.stringify() 函数,可以把 JS 数据转换为 JSON 格式的字符串,例如:

在这里插入图片描述

JSON文件的语法要求

封装自己的 Ajax 函数

function SelfAjax(options) {
  //初始化对象
  const xhr = new XMLHttpRequest()
  //处理get请求传参,本质上是将参数对象做处理后追加到url后面
  if (options.params) {
    let arr = []
    for (k in options.params) {
      arr.push(`${k}=${options.params[k]}`)
    }
    options.url +='?'+arr.join('&')
  }
  //准备数据
  xhr.open(options.method, options.url)
  
  //如果是post请求
  if (options.method.toLowerCase() == 'post' && options.data) {
    //如果data属性值是FormData类型,直接发送数据请求(fd为二进制对象,可不做编码处理)
    if (options.data instanceof FormData) {
      xhr.send(options.data)
    }//如果data属性值是String类型,需定义头部请求中编码格式再发送数据请求(表单对象.serialize()可获取字符串类型的表单提交数据)
    else if (typeof options.data === 'string') {
      xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded')
      xhr.send(options.data)
    }//如果data属性值是Object类型,需定义头部请求中编码格式为json再发送数据请求
    else if (typeof options.data === 'object') {
      xhr.setRequestHeader('Content-Type', 'application/json')
      //将object对象转换为json字符串
      xhr.send(JSON.stringify(options.data))
    }
  } else {
  //发送数据请求
  xhr.send()
  }
  //监听onload事件,获得返回值
  xhr.addEventListener('load', function () {
    //将返回的json数据转换为js对象
    let data = JSON.parse(xhr.response)
    //服务器返回的数据交给函数调用的业务逻辑处理
    options.success && options.success(data)
  })
}

同源策略 & 跨域

什么是同源?

同源指的是两个 URL 地址具有相同的协议、主机名、端口号。

例如,下表给出了相对于 http://www.test.com/index.html 页面的 5 个同源检测结果:

URL是否同源原因说明
http://www.test.com/other.html同源(协议、域名、端口相同)
https://www.test.com/about.html协议不同(http 与 https)
http://blog.test.com/movie.html域名不同(www.test.com 与 blog.test.com)
http://www.test.com:7001/home.html端口不同(默认的 80 端口与 7001 端口)
http://www.test.com:80/main.html同源(协议、域名、端口相同)

什么是跨域?

同源指的是两个 URL 的协议、主机名、端口号完全一致,反之,则是跨域。

出现跨域的根本原因:浏览器的同源策略不允许非同源的 URL 之间进行资源的交互。例如:
网页:http://www.test.com/index.html
接口:http://www.api.com/userlist
受到同源策略的限制,上面的网页请求下面的接口会失败!

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ajNtr4At-1642253567805)(assets/1642211195677.png)]

突破浏览器跨域限制的三种方案

方案诞生的时间方案来源优点缺点
JSONP出现较早民间(非官方)兼容性好(兼容低版本 IE)仅支持 GET 请求
CORS出现较晚W3C 官方标准支持 GET、POST、PUT、DELETE、PATCH等常见的请求方式不兼容某些低版本浏览器

目前 JSONP 在实际开发中很少会用到,CORS 是跨域的主流技术解决方案。

第三种方式:反向代理,让本源的服务器向跨域的服务器请求数据并响应,本源服务器将响应的数据转发给浏览器.

JSONP 的底层实现原理

JSONP 在底层,用到了

原因:

script 标签的 src 属性,不受浏览器同源策略的限制
可以把非同源的 JavaScript 代码请求到本地,并执行

防抖 & 节流

防抖

什么是防抖?

防抖(debounce)指的是:频繁触发某个操作时,只执行最后一次。

防抖的本质::利用setTimeou延时器

在这里插入图片描述

防抖应用场景

场景:搜索框只在输入完后,才执行查询的请求。
好处:这样可以有效减少请求的次数,节省网络资源。

在这里插入图片描述

核心代码:getSuggestList()方法是封装的根据用户输入文本获取服务器请求返回的搜索建议并展示到页面中的方法

在这里插入图片描述

节流

什么是节流?

节流(throttle)指的是:单位时间内,频繁触发同一个操作,只会触发 1 次

在这里插入图片描述

节流应用场景

射击游戏中,单位时间内只能发射一颗子弹。

在这里插入图片描述

核心代码,isok为节流阀

在这里插入图片描述

举报

相关推荐

0 条评论