跨域与JSONP 防抖与节流

news/2024/7/19 12:53:47 标签: js, json, postman

跨域与JSONP

  • 了解同源策略和跨域
    • 实现跨域数据的请求
  • JSONP
    • 实现原理
    • JQuery中的JSONP
  • 防抖和节流
    • 什么是防抖
      • 缓存搜索结果
    • 什么是节流

了解同源策略和跨域

什么是同源:如果两个页面的协议域名端口号都相同,则两个页面具有相同的源,只要三者中任何一项不同则是跨域
示例:

var url = "http://www.test.com/index.html"
//协议:http
//域名:www.test.com
//端口号:80(域名后面紧跟的:就是端口号,没有则默认是80)

同源策略:是浏览器提供的一个安全功能,同源策略禁止了不同源网站之间利用JS进行资源交互,这是一个用于隔离潜在恶意文件的重要安全机制。主要体现在以下几个方面:

  1. 无法读取非同源网页的cookie、LocalStore和IndexDB
  2. 无法接触非同源网页的DOM
  3. 无法向非同源地址发送Ajax请求

实现跨域数据的请求

实现跨域数据请求,主要有两种方案,一是JSOPCORS
JSON:出现的早,兼容性好,但是只支持get请求不支持post请求。

CORS:出现的比较晚,是W3C标准,属于Ajax跨域请求数据的根本解决方案,支持get和post请求,缺点是不兼容某些低版本的浏览器。

JSONP

JSON(JSON with Padding)是JSON的一种使用模式,可用于解决主流浏览器的跨域数据访问的问题。

实现原理

受同源策略的影响,网页中无法通过Ajax请求非同源的接口数据。但是<script>标签则不受浏览器同源策略的影响,可以通过src属性,请求非同源的脚本。因此,JSONP的实现原理就是通过<script>标签的src属性,请求跨域的数据接口,并通过函数调用的形式,接收跨域接口响应回来的数据。由于JSONP没有用到XMLHttpRequest对象,所以不属于Ajax

先在定义一个回调函数:

<script>
function success(data){
	console.log("获取到了数据!");
	console.log(data);
}
</script>

然后在另一个

<script src="123.js?callback=success"></script>

自定义实现一个简单的JSONP:

<script>
	//首先仍然是自定义一个回调函数
	function success(data){
		console.log(data);
	}
</script>
<script src="http://ajax.frontend.itheima.net:3006/api/jsonp?callback=success"></script>

JQuery中的JSONP

JQuery中提供的$.ajax()函数不但可以发起真正的ajax请求,还可以发起JSONP数据请求:

$.ajax({
	url: "http://ajax.frontend.itheima.net:3006/api/jsonp?callback=success",
	//如果要使用ajax发起JSONP请求,则需要指定dataType属性为“JSONP”
	dataType: "JSONP",
	//jsonpCallback属性用于修改回调函数名,默认是callback
	jsonpCallback: "cb",
	success: function (data){
		console.log(data);
	}
});

防抖和节流

什么是防抖

防抖策略(debounce)是当事件被触发后,延迟n秒后再执行回调,如果在这n秒内事件又被触发,则重新计时。
可以用下图理解防抖策略:
防抖
防抖策略的好处:当我们频繁地触发某个事件时,让回调函数最终只执行最后一次,可以可以有效减少请求次数,节约请求资源。
防抖的应用场景:用户在输入框中输入一串字符串时,通过防抖策略,只在输入完成后进行查询,减少请求次数,节约资源。还有其他应用场景等。

具体实现代码:(以用户向输入框输入文字为例)

var timer = null;
function debounceSearch(){
	timer = setTimeout(function(){
		//这里是将用户输入的值发送到服务器请求搜索数据后将结果展示到下来菜单的代码
	}, 500);
}

//在<input type="text" id="ipt">输入框标签中绑定keyup事件
var ipt = document.querySelector("#ipt");
ipt.addEventListener("keyup", function(){
	//每次按下后将定时器清空
	clearTimerout(timer);
	//...这里是部分业务相关代码,比如输入框为空值时清空展示列表并隐藏
	//下一步重新开启定时器
	debounceSearch();
});

缓存搜索结果

对于输入框,不仅可以设置防抖来减少服务器的请求次数,还可以设置保存缓存搜索的建议列表来防止重复搜索相同内容。

第一步:设置一个全局缓存对象
第二步:当得到服务器的响应后的数据,将用户在输入框中输入的字符串作为,服务器响应回来的数据(对象)作为,存储在刚刚设置的全局缓存对象中。
第三步:优先从缓存中获取搜索建议

什么是节流

节流策略(throttle),就是指在某一段时间内减少事件的触发频率。
比如在射击类游戏中,装弹时再次装弹是无意义的操作,必须等装弹完成后才能再次装弹。再比如高铁上的卫生间,有红绿灯,当为红灯时厕所不可用,绿灯才可用,这里红绿灯就是节流阀了。
节流的应用场景:

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

http://www.niftyadmin.cn/n/484133.html

相关文章

Git版本控制系统的基本使用

Git版本控制系统概念基础版本控制软件使用版本控制软件的好处版本控制系统的分类Git基础什么是GitGit的三个区域工作区中文件的四种状态Git的三种状态基本的Git工作流程安装并配置Git配置用户信息查看Git全局的配置信息方法一方法二查看帮助信息获取Git仓库方法一&#xff1a;将…

mysql 8.0 (ga)_技术分享 | MySQL 8.0.17 GA 发布!

原创&#xff1a; 管长龙昨日 MySQL 官网正式发布 8.0.17 / 5.7.27 / 5.6.45 三个(维护)版本&#xff0c;距离上一个 GA 版本(8.0.16)发布时隔仅 88 天&#xff01;MySQL 各开发团队的博客网站&#xff0c;同一时间发布了多篇文章报道新版本发布(后续翻译)。三个版本除了修复 B…

pyqt5中如何连接mysql_Windows环境下 PyQt5 如何安装MySql驱动 (PyQt5连接MYSQL时显示Driver not loaded解决方案)...

参考文章&#xff1a;前文说过如何在Ubuntu环境下 为PyQt5 安装MySql驱动&#xff0c; 这里面主要说的是如何在Windows环境下安装MySql驱动。#-*- coding: utf-8 -*-【简介】PyQt5中 处理database 例子importsysfrom PyQt5.QtCore import *from PyQt5.QtGui import *from PyQt…

初步学习Node.js

初步学习Node.js什么是Node.js判断node.js是否安装成功在node.js环境中执行JavaScript代码fs文件系统模块什么是fs文件系统模块读取指定文件中的内容判断文件是否读取成功向指定的文件中写入内容判断文件是否写入成功fs文件模块路径动态拼接的问题解决方案使用绝对地址使用__di…

Node.js中的mysql模块

Node.js中的mysql模块在Express中连接mysql并使用select查询insert插入update更新delete删除标记删除在Express中连接mysql并使用 首先要在项目中导入mysql模块 npm i mysql在使用mysql模块控制MySQL数据库之前&#xff0c;需要对mysql模块进行一些配置 // 导入mysql模块 co…

对密码进行加密处理

对密码进行加密处理对密码进行加密处理bcryptjs包加密值比较对密码进行加密处理 为了保证数据的安全性&#xff0c;不建议将密码按明文的形式存储&#xff0c;而是建议将密码加密存储。 bcryptjs包 使用bcryptjs对用户密码加密有以下优点 加密后无法逆向破解同一明文加密多…

exsi 端口_ESXI 6.7修改网页端口号

一、终端开启SSH功能&#xff0c;方便修改出错维护1&#xff0e;按F2进入登录界面&#xff0c;输入用户名和密码&#xff1b;2.Troublesboot Options 按enter键进入下级页面&#xff1b;3.在选择ssh选项是enter键切换启用或者禁用。(显示Disable为已开启&#xff0c;是关闭选…

前端身份认证

前端身份认证在Express中使用Session认证什么是CookieCookie在身份认证中的作用Session的工作原理安装express-session中间件Session认证的局限性在Express中使用JWT认证机制JWT的使用方式安装JWT相关的包在Express中使用Session认证 Session需要搭配Cookie进行认证 什么是Co…