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

news/2024/5/7 15:16:41/文章来源:https://blog.csdn.net/m0_62360527/article/details/127851991

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. 定义延时器的Idvar timer = null// 定义全局缓存对象var cacheObj = {}// 2. 定义防抖的函数function debounceSearch(kw) {timer = setTimeout(function () {getSuggestList(kw)}, 500)}// 为输入框绑定 keyup 事件$('#ipt').on('keyup', function () {// 3. 清空 timerclearTimeout(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.luyixian.cn/news_show_224113.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

调优工具常用命令

语法格式 mysqldumpslow [ OPTS... ] [ LOGS... ] //命令行格式常用到的格式组合 -s 表示按照何种方式排序c 访问次数l 锁定时间r 返回记录t 查询时间al 平均锁定时间ar 平均返回记录数at 平均查询时间 -t 返回前面多少条数据 -g 后边搭配一个正则匹配模式&#xff0c;大小写…

Opencv——直方图、掩膜、直方图均衡化详细介绍及代码实现

一、图像直方图 1.1 定义&#xff1a; 图像直方图是图像的基本属性之一&#xff0c;也是反映图像像素数据分布的统计学特征&#xff0c;其横坐标代表了图像像素点在[0,255]范围中&#xff0c;纵坐标代表图像像素点出现的个数或百分比。如图&#xff1a; 1.2 函数&#xff1a;…

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

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

多层串联拼接网络

🍿*★,*:.☆欢迎您/$:*.★* 🍿 目录 背景 正文 总结 背景描述

什么是JUC

什么是JUC JUC指的是&#xff1a;Java里的三个包 java.util.concurrentjava.util.concurrent.atomic&#xff1a;原子性java.util.concurrent.locks&#xff1a;lock锁回顾线程和进程 进程 程序执行的一次过程&#xff0c;一个进程包含一个或多个线程。进程是资源分配的单位 …

UE4 回合游戏项目 17- 进入指定区域触发战斗事件

在上一节&#xff08;UE4 回合游戏项目 16- 控制玩家&#xff09;基础上&#xff0c;增加角色走进指定区域从而触发战斗场景的功能 主要思想是添加一个碰撞区域&#xff0c;当玩家与该区域碰撞时&#xff0c;触发战斗事件 效果&#xff1a; 步骤&#xff1a; 1.新建蓝图类 选…

Allegro给各种形式的板框导弧操作指导

Allegro给各种形式的板框导弧操作指导 Allegro可以给板框导弧,让加工出来的板框更加圆滑,具体操作步骤如下 板框是line形式的 选择Manufacture-Drafting-Fillet命令 在Options里面Radius输出导弧的半径,比如78.74 框选两个线段的部分 完成后的效果如下图 框选4个角落,…

PCB Layout爬电距离、电气间隙如何确定-安规

PCB Layout爬电距离、电气间隙如何确定 爬电距离&#xff1a;沿绝缘表面测得的两个导电零部件之间或导电零部件与设备防护界面之间的最短路径。 电气间隙&#xff1a;在两个导电零部件之间或导电零部件与设备防护界面之间测得的最短空间距离。即在保证电气性能稳定和安全的情况…

用python就获取到照片拍摄时的详细位置【源码公开】

文章目录一.引言1.读取照片信息&#xff0c;获取坐标2.通过baidu Map的API将GPS信息转换成地址。二.源码附上&#xff01;&#xff01;&#xff01;注意事项一.引言 先看获取到的效果 拍摄时间&#xff1a;2021:12:18 16:22:13 照片拍摄地址:(内蒙古自治区包头市昆都仑区, 内…

广和通5G AIoT模组引领亮相2022国际物联网展(IOTE),智赋行业数字化新价值

11月15-17日&#xff0c;2022国际物联网展&#xff08;IOTE&#xff09;于深圳盛大启幕&#xff0c;本届展会汇聚众多物联网行业大咖&#xff0c;共同展示并探讨物联网产业链的创新实践与成果。广和通以“5GAIoT深度融合&#xff0c;创新智造未来”为主题亮相现场。本次广和通展…

2.10.2版本的青龙升级2.10.13及2.11.3版本的教程

重要提醒&#xff1a; 这个教程仅限使用我下面这个命令搭建的青龙面板使用 docker run -dit \--name QL \--hostname QL \--restart always \-p 5700:5700 \-v $PWD/QL/config:/ql/config \-v $PWD/QL/log:/ql/log \-v $PWD/QL/db:/ql/db \-v $PWD/QL/scripts:/ql/scripts \-…

HTML知识点总结篇(一)

src和href的区别 作用结果不同 src用于替换当前内容href用于在引用资源和当前文档之间建立链接 请求资源类型不同 在请求src资源时&#xff0c;会将其指向的资源下载并应用到文档中。常用于img/iframe/input/style/scripthref常用于建立当前元素和文档之间的链接。常用的有lin…

【EC200U】GPS定位

EC200U GPS定位GNSS模块quecgnss - 内置GNSSGNSS 功能初始化GNSS 工作状态获取GNSS开关GNSS定位数据获取实测案例拓展当前互联网地图的坐标系现状地球坐标 (WGS84)火星坐标 (GCJ-02)也叫国测局坐标系百度坐标 (BD-09)coordtransform 坐标转换EC系列东西很多&#xff0c;网上资料…

高精度算法【加减乘除】

全文目录&#x1f60d; 前言&#x1f600; 高精度加法&#x1f914; 操作步骤&#x1f635;‍&#x1f4ab; 代码模板&#x1f600;高精度减法&#x1f914;操作步骤&#x1f635;‍&#x1f4ab; 代码模板&#x1f600;高精度乘法&#x1f914;操作步骤&#x1f635;‍&#x…

基于SSM花卉商城设计与实现

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

记一道前端高难度面试题

目录 提问&#xff1a;如何让下面的这行代码成立 1.错误原因 2.思路 3.解题 4.小结 提问&#xff1a;如何让下面的这行代码成立 var [a,b] {a:1,b:2} 直接运行会报错&#xff0c;报错信息如下&#xff1a; Uncaught TypeError: {(intermediate value)(intermediate valu…

轻松学会jQuery选择器的用法

文章目录⛳️ 选择器✨ 属性选择器✨ 包含选择器✨ 位置选择器✨ 过滤选择器✨ 反向选择器⛳️ 快速投票⛳️ 选择器 本篇重点讲解jQuery中丰富的选择器&#xff0c;以及他们的基本用法。CSS的选择器均可以用jQuery的$进行选择&#xff0c;部分浏览器对CSS3的选择器支持不全&am…

【Pytorch with fastai】第 6 章 :其他计算机视觉问题

&#x1f50e;大家好&#xff0c;我是Sonhhxg_柒&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流&#x1f50e; &#x1f4dd;个人主页&#xff0d;Sonhhxg_柒的博客_CSDN博客 &#x1f4c3; &#x1f381;欢迎各位→点赞…

都说测试行业饱和了,为什么我们公司给初级测试开到了12K?

故事起因&#xff1a; 最近我有个刚毕业的学生问我说&#xff1a;我感觉现在测试行业已经饱和了&#xff0c;也不是说饱和了&#xff0c;是初级的测试根本就没有公司要&#xff0c;哪怕你不要工资也没公司要你&#xff0c;测试刚学出来&#xff0c;没有任何的项目经验和工作经验…

MaxViT: Multi-Axis Vision Transformer

论文&#xff1a;https://arxiv.org/abs/2204.01697 代码地址&#xff1a;https://github.com/google-research/maxvit 在本文中&#xff0c;介绍了一种高效且可扩展的注意力模型&#xff0c;称之为多轴注意力&#xff0c;该模型由两个方面组成&#xff1a;分块的局部注意力和…