【Ajax进阶】跨域和JSONP的学习

news2025/2/28 19:42:04

csdn动态图标

✍️ 作者简介: 前端新手学习中。

💂 作者主页: 作者主页查看更多前端教学

🎓 专栏分享:css重难点教学   Node.js教学 从头开始学习   ajax学习

文章目录

  • 了解同源策略和跨域
    •   同源策略
      •     什么是同源
      •     什么是同源策略
    •   跨域
      •     什么是跨域
      •     浏览器对跨域请求的拦截
      •     如何实现跨域数据请求
  • JSONP
    •   JSONP的实现原理
    •   自己实现一个简单的JSONP
    •   JSONP的缺点
    •   jQuqery中的JSONP
    •   自定义参数及回调函数的名称
    •   jQuery中JSONP的实现过程
  • 案例——淘宝搜索
    •   效果
    •   代码
  • 防抖和节流
    •   什么是防抖
    •   防抖的应用场景
    •   实现防抖
    •   什么是节流
    •   节流的应用场景
    •   鼠标跟随案例
    •   总结防抖和节流的区别

了解同源策略和跨域

  同源策略

    什么是同源

如果两个页面的协议,域名和端口都相同,则两个页面具有相同的源。

例如,下表给出了相对于http://www.test.com:80/index.html 端口号不写,默认为80.。

  • http(协议)
  • www.test.com (域名)
  • 80 (端口)

在这里插入图片描述

    什么是同源策略

同源策略(英文全称 Same origin policy)是浏览器提供的一个安全功能。
MDN官方给定的概念:同源策略限制了从同一个源加载的文档或脚本如何与来自另一个源的资源进行交互,这是一个用于隔离潜在恶意文件的重要安全机制。
通俗的理解:浏览器规定,A网站的JavaScript,不允许和非同源的网站C之间,进行资源的交互,例如:
1.无法读取非同源网页的Cookie,LocalStorage和IndexedDB。
2 无法接触非同源网页的DOM。
3 无法向非同源地址发送Ajax请求。

  跨域

    什么是跨域

跟同源相反,同源指的是两个URL的协议,域名,端口号一致,反之,则是跨域。
出现跨域的根本原因:浏览器的同源策略不允许非同源的URL之间进行资源的交互。
在这里插入图片描述

    浏览器对跨域请求的拦截

在这里插入图片描述

    如何实现跨域数据请求

现如今,实现跨域数据请求,最主要的两种解决方案,分别是JSONP和CORS。
JSONP:出现的早,兼容性好。是前端程序员为了解决跨域问题,被迫想出来的一种临时解决方案,缺点是只支持GET请求,不支持POST请求。
CORS:出现的较晚,它是W3C标准,属于跨域Ajax请求的根本解决方案,支持GET和POST请求,缺点是不兼容某些低版本的浏览器。

JSONP

  JSONP的实现原理

由于浏览器同源策略的限制,网页中无法通过Ajax请求非同源的接口数据。但是<script>标签不受浏览器同源策略的影响,可以通过src属性,请求非同源的js脚本。
因此,JSONP的实现原理,就是通过

<body>
    <script>
        $.ajax({
            method: 'get',
            url: 'http://www.liulongbin.top:3006/api/jsonp',
            data: {
                name: 'xiaoxie',
                age: 20
            },
            success: function (res) {
                console.log(res);
            }
        })
    </script>
</body>

在这里插入图片描述
图中标红的这一段表示跨域,在这里插入图片描述
因为我们的协议是本地file,所以会跨域,之前能访问成功,是因为后端配置了cors所以才能成功访问。

  自己实现一个简单的JSONP

定义一个success回调函数

    <script>
        function success(data) {
            console.log('拿到了data数据');
            console.log(data);
        }

    </script>

通过script标签,调用接口数据

//指定callback来调用 指定的函数,后端会根据接受到的这个函数改变函数名。
    <script src="./16.JSONP3.js?callback=success"></script>

在这里插入图片描述
在这里插入图片描述

我们通过这个方法调用之前跨域的链接

<body>
    <script>
        function success(data) {
            console.log('拿到了data数据');
            console.log(data);
        }

    </script>
    //直接从链接后面写上附带的数据。
    <script src="http://www.liulongbin.top:3006/api/jsonp?callback=success&name=xiaoxie&age=20"></script>
</body>

在这里插入图片描述
发起的并不是ajax请求,所以跳过了同源策略,请求成功。
在这里插入图片描述

  JSONP的缺点

由于JSONP是通过script标签的src属性,来实现跨域数据获取的,所以,JSONP支持get数据请求,不支持POST请求,只能默认发起get请求。

注意:JSONP和Ajax之间没有任何关系,不能把JSONP请求数据的方式叫做Ajax,因为JSONP没有用到XMLHttpRequest这个对象。
在这里插入图片描述

  jQuqery中的JSONP

jquery提供的$.ajax()函数,除了可以发起真正的Ajax数据请求之外,可以通过改变数据类型使其能够发起JSONP数据请求。

        $.ajax({
            url: 'http://www.liulongbin.top:3006/api/jsonp?name=xiaoixe&age=20',
            dataType: 'jsonp',
            success: function (res) {
                console.log(res);
            }
        })
    </script>

在这里插入图片描述

默认情况下,使用jQuery发起post请求,会自动携带一个callback=jQueryxxx的参数,jQueryxxx是随机生成的一个回调函数名称。

  自定义参数及回调函数的名称

        $.ajax({
            url: 'http://www.liulongbin.top:3006/api/jsonp?name=xiaoixe&age=20',
            dataType: 'jsonp',
            //自定义参数
            jsonp: 'cb',
            //自定义函数名称
            jsonpCallback: 'hanshu',
            success: function (res) {
                console.log(res);
            }
        })

  jQuery中JSONP的实现过程

jQuery中的JSONP,也是通过script标签的src属性实现跨域数据访问的,只不过,jquery采用的是动态创建和移除script标签的方式,来发起的JSONP的数据请求。

  • 在发起JSONP请求的时候,动态向header中append一个script标签
  • 在JSONP 请求成功后,动态从header中移除刚才append进去的script标签

案例——淘宝搜索

  效果

实现搜索框,文字提示效果。
在这里插入图片描述

  代码

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8" />
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  <meta http-equiv="X-UA-Compatible" content="ie=edge" />
  <title>Document</title>
  <!-- 导入页面的基本样式 -->
  <link rel="stylesheet" href="./css/search.css" />
  <!-- 导入 jQuery -->
  <script src="./lib/jquery.js"></script>
  <!-- 导入模板引擎 -->
  <script src="./lib/template-web.js"></script>
</head>

<body>
  <div class="container">
    <!-- Logo -->
    <img src="./images/taobao_logo.png" alt="" class="logo" />

    <div class="box">
      <!-- tab 栏 -->
      <div class="tabs">
        <div class="tab-active">宝贝</div>
        <div>店铺</div>
      </div>
      <!-- 搜索区域(搜索框和搜索按钮) -->
      <div class="search-box">
        <input id="ipt" type="text" class="ipt" placeholder="请输入要搜索的内容" /><button class="btnSearch">
          搜索
        </button>
      </div>
      <!-- 搜索建议列表 -->
      <div id="suggest-list"></div>
    </div>
  </div>

  <!-- 模板结构 -->
  <script type="text/html" id="tpl-suggestList">
    {{each result}}
      <!--搜索建议项-->
      <div class="suggest-item">{{$value[0]}}</div>
    {{/each}}
  </script>

  <script>
    $(function () {
      // 1. 定义延时器的Id
      var timer = null
      // 定义全局缓存对象
      var cacheObj = {}

      // 2. 定义防抖的函数
      function debounceSearch(kw) {
        timer = setTimeout(function () {
          getSuggestList(kw)
        }, 500)
      }

      // 为输入框绑定 keyup 事件
      $('#ipt').on('keyup', function () {
        // 3. 清空 timer
        clearTimeout(timer)
        var keywords = $(this).val().trim()
        if (keywords.length <= 0) {
          return $('#suggest-list').empty().hide()
        }

        // 先判断缓存中是否有数据
        if (cacheObj[keywords]) {
          return renderSuggestList(cacheObj[keywords])
        }

        // TODO:获取搜索建议列表
        // console.log(keywords)
        // getSuggestList(keywords)
        debounceSearch(keywords)
      })

      function getSuggestList(kw) {
        $.ajax({
          url: 'https://suggest.taobao.com/sug?q=' + kw,
          dataType: 'jsonp',
          success: function (res) {
            // console.log(res)
            renderSuggestList(res)
          }
        })
      }

      // 渲染UI结构
      function renderSuggestList(res) {
        if (res.result.length <= 0) {
          return $('#suggest-list').empty().hide()
        }
        var htmlStr = template('tpl-suggestList', res)
        $('#suggest-list').html(htmlStr).show()

        // 1. 获取到用户输入的内容,当做键
        var k = $('#ipt').val().trim()
        // 2. 需要将数据作为值,进行缓存
        cacheObj[k] = res
      }
    })
  </script>
</body>

</html>

防抖和节流

  什么是防抖

防抖策略是当事件被触发后,延迟n秒后再执行回调,如果在这n秒内事件又被触发,则重新计时。
在这里插入图片描述

  防抖的应用场景

用户在输入框中连续输入一串字符时,可以通过防抖策略,只在输入完后,才执行查询的请求,这样可以有效减少请求次数,节约请求资源;

  实现防抖

在这里插入图片描述

  什么是节流

节流策略,顾名思义,可以减少一段时间内事件的触发频率。

在这里插入图片描述

  节流的应用场景

  1. 鼠标连续不断的触发事件(如点击),只在单位时间内触发一次;
  2. 懒加载时要监听计算滚动条的位置,但不必每次滑动都触发,可以降低计算机的频率,而不必去浪费CPU资源。

  鼠标跟随案例

无节流代码

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script src="./引入/jquery.js"></script>
    <style>
        html,
        body {
            margin: 0;
            padding: 0;
            overflow: hidden;
        }

        #angel {
            position: absolute;
        }
    </style>
</head>

<body>
    <img src="./引入/angel.gif" alt="" id="angel">
    <script>
        //外面获取防止重复性获取
        let angel = $('#angel');
        $(document).on('mousemove', function (e) {
            //设置图片位置
            $(angel).css('top', e.pageY + 'px').css('left', e.pageX + 'px');
        })
    </script>
</body>

</html>

节流阀

节流阀为空,表示可以执行下次操作,不为空表示不能执行下次操作。
当前操作执行完,必须将节流阀重置为空,表示可以执行下次操作。
每次执行操作前,必须先判断节流阀是否为空。

使用节流阀优化鼠标跟随效果

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script src="./引入/jquery.js"></script>
    <style>
        html,
        body {
            margin: 0;
            padding: 0;
            overflow: hidden;
        }

        #angel {
            position: absolute;
        }
    </style>
</head>

<body>
    <img src="./引入/angel.gif" alt="" id="angel">
    <script>
        //外面获取防止重复性获取
        let angel = $('#angel');
        //定义节流阀
        let timer = null;

        $(document).on('mousemove', function (e) {
            if (timer) {
                return
            }
            setTimeout(function () {
                //设置图片位置
                $(angel).css('top', e.pageY + 'px').css('left', e.pageX + 'px');
                timer = null;
            }, 16)
        })
    </script>
</body>

</html>

在这里插入图片描述

  总结防抖和节流的区别

  • 防抖:如果事件被频繁触发,防抖能保证只有一次触发生效,前面的多次触发都会被忽略
  • 节流:如果事件被频繁触发,节流能够减少事件触发的频率,因此,节流是有选择性的执行一部分事件。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/9464.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

python基础07——函数,想重复使用自己的代码就写个函数吧

目录1 函数定义与调用1.1 自定义模块函数1.2 函数的返回值 return2 参数的传递方式2.1 位置参数2.2 默认值参数2.3 关键参数2.4 可变长度参数(收集和分配参数)2.4.1 收集位置参数2.4.2 分配位置参数,函数参数的序列解包2.4.3 收集关键字参数2.4.4 分配关键字参数3 变量的作用域…

腾讯云GPU云服务器在选择实例配置时应该注意哪些事项?

腾讯云异构计算服务器搭载GPU、FPGA等异构硬件&#xff0c;具有实时高速的并行计算和浮点计算能力&#xff0c;适合于深度学习、科学计算、视频编解码和图形工作站等高性能应用&#xff0c;下面分享腾讯云NVIDIA GPU云服务器配置CPU内存性能注意事项&#xff1a; NVIDIA GPU云…

26、Stream流式计算,链式编程

Stream流式计算&#xff0c;链式编程 什么是stream流式计算&#xff1f; 大数据包括&#xff08;存储计算&#xff09; 集合&#xff0c;mysql这些是用来存储的&#xff0c;而计算是用stream流式的 题目案例&#xff1a;只用一行代码&#xff0c;完成计算这些操作 操作&…

软件工程师备考1-2章(续)

一:差错控制 (1)奇偶检验 什么意思呢? 如果我们用 奇校验,就是保证传输过来的数据中的1是奇数,如果不是奇数那么说明传输错误。 (所以会增加一位,保证正确的数据的总的1一定是奇数) (2)海明码 什么是海明距离? 两个码字,例如 0 1 0 0 和 0 0 1 0 可以看到这…

java的Excel导出方式总结

一、使用hutool导出excel 1.1 hutool介绍 hutool功能很强大&#xff0c;http请求到json处理、excel的导入导出、定时任务、IO、缓存、数据库操作等都提供了简单而方便的api供我们使用&#xff0c;好处是再也不用担心自己去整理常用的工具类了&#xff0c;同时也支持按需引入【但…

怎样在PDF上直接编辑文字?这几种编辑方法需要掌握

怎么做才能够直接在PDF文件上编辑文字呢&#xff1f;对PDF文件大家在工作中是经常使用的&#xff0c;相信大家也都亲身体验过&#xff0c;那就是经常会看见文件中有错误的地方&#xff0c;可能只是一个错别字&#xff0c;或者是图片错误&#xff0c;但我们也不得不改&#xff0…

2023年前端开发趋势未来可期

☆ 对于很多质疑&#xff0c;很多不解&#xff0c;本文将从 △ 目前企业内前端开发职业的占比&#xff1b; △ 目前业内开发语言的受欢迎程度&#xff1b; △ 近期社区问答活跃度&#xff1b; 等维度来说明目前前端这个职业的所处位置。 ☆ 还有强硬的干货&#xff0c;通过深入…

MQTT 协议的基本概念

目录 1、MQTT 介绍 2、MQTT 发布-订阅模式 &#xff08;1&#xff09;Broker 可拓展 &#xff08;2&#xff09;Broker 消息过滤 &#xff08;3&#xff09;MQTT 的主要特征是什么&#xff1f; &#xff08;4&#xff09;MQTT 和消息队列的区别 3、MQTT 客户端、 Broker…

6-TRITC 四甲基罗丹明-6-异硫氰酸 CAS 80724-20-5

产品名称&#xff1a;6-TRITC 四甲基罗丹明-6-异硫氰酸 英文名称&#xff1a;6-TRITC [Tetramethylrhodamine-6-isothiocyanate] CAS&#xff1a;80724-20-5 结构式&#xff1a; Ex (nm) 544 Em (nm) 570 分子量 479.98 溶剂 DMSO 存储条件 在零下15度以下保存, 避免光…

使用Idea新建Play项目sbt构建失败,提示scala-xml依赖冲突

最近学习scala和paly,使用idea模板创建项目后&#xff0c;项目构建时就发现报错了&#xff0c;处理了很久&#xff0c;记录一下。 错误日志: [error] (update) found version conflict(s) in library dependencies; some are suspected to be binary incompatible: [error] […

协程原理与设计

什么是M:N协程&#xff1f;为什么要支持M:N协程&#xff1f;如何设计M:N协程&#xff1f;tRPC-Cpp引入了公司开源组件Flare/fiber作为底层库&#xff0c;本文多角度分析梳理了M:N协程的关键原理和特性。1 常见线程模型的问题 在高并发编程场景&#xff0c;如互联网后台类业务中…

尚医通 (十九) --------- 数据字典导出与导入

目录一、数据字典导出1. 导出接口封装2. 在 service-cmn 模块添加 service 方法3. 在 service-cmn 模块添加 controller 方法4. 测试5. 导出前端实现二、数据字典导入1. 导入接口封装2. 导入前端实现一、数据字典导出 1. 导出接口封装 A、在 model 模块添加导出实体 在 mode…

【论文解析】Deep Generative Models on 3D Representations: A Survey

文章目录内容组织结构3 FUNDAMENTALS3.1 Deep Generative ModelsGenerative Adversarial Networks.Variational AutoencodersNormalizing Flows.Diffusion ModelsEnergy-based model.3.2 3D RepresentationsVoxel gridsPoint cloudsMeshesNeural fieldsHybrid representation.4…

读《高性能MySQL》笔记---索引

索引是存储引擎用于快速找到记录的的一种数据结构。 索引的优点 索引大大减少服务器需要扫描的数据量。索引帮助服务器避免排序和临时表。索引将随机IO变为顺序IO。 说明&#xff1a; 顺序IO&#xff1a;是指读写操作的访问地址连续。在顺序IO访问中&#xff0c;HDD所需的磁…

生产环境日志还用notepad++?难怪定位慢,UltraEdit了解一下!

最近这两天运营部门反馈有会员的会员卡开卡时间与相关页面显示的开卡时间不一致&#xff0c;需要定位确定哪个时间是准确的。对于线上数据异常问题一定要谨慎处理&#xff0c;因为很有可能会是用户的某些非常规操作导致部分场景漏测。 对于这种数据异常的业务问题&#xff…

顺序存储二叉数(Java)

1、顺序存储二叉数 从存储角度来看&#xff0c;我们之前讲的树在存储结构上不是顺序存储的&#xff0c;都是非线性的存储结构&#xff0c;所以我们可以从数组的角度来分析&#xff0c;数组和树可以相互转换&#xff0c;数组可以转换成树&#xff0c;树也可以转换成数组&#x…

吗咿呀嘿-用js来搞个简单的人脸识别

缘起 “蚂蚁呀嘿&#xff0c;蚂蚁呀呼&#xff0c;蚂蚁呀哈” 相信最近好多人的朋友圈或者抖音都被类似视频刷过屏&#xff01; 类似的效果最早是在2020年初&#xff0c;那个时候大家应该还都记得&#xff0c;几乎所有的人都因为疫情原因被迫线上办公&#xff01; 工作当然离不…

mybatisPlus

第十一章&#xff1a;Mybatis_plus 第1节&#xff1a;简介 本章节主要介绍mybatisPlus是mybatis的增强工具&#xff0c;只做增强不做改变&#xff0c;不会对mybatis产生任何影响。它的主要优势具有无侵入、损耗小、强大的CRUD操作、支持 Lambda 形式调用、支持 ActiveRecord模…

向毕业妥协系列之机器学习笔记:无监督学习-异常检测

目录 一.发现异常事件 二.高斯正态分布 三.异常检测算法 四.开发与评估异常检测系统 五.异常检测与监督学习对比 六.选择使用什么特征 一.发现异常事件 下图的例子是飞机发动机的制造&#xff0c;有很多特征&#xff0c;我们为了方便讲解取其中的两个特征&#xff1a;发…

基于JavaWeb的小区物业管理系统的设计与实现

项目描述 临近学期结束&#xff0c;还是毕业设计&#xff0c;你还在做java程序网络编程&#xff0c;期末作业&#xff0c;老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。这里根据疫情当下&#xff0c;你想解决的问…