同源策略与跨域

  • 同源策略
    • 定义
    • 比较
    • 通俗理解
  • 跨域
    • 定义
    • 浏览器对跨域请求的拦截
    • 实现跨域的两种方法
    • 自定义JSONP
    • jQuery的JSONP
  • 防抖与节流
    • 防抖
    • 节流
    • 总结

同源策略

定义

同源策略(英文全称 Same origin policy)是浏览器提供的一个安全功能
两个页面的协议、域名、端口都相同时,则具有相同的源

比较

下表给出了相对于 http://www.test.com/index.html 页面的同源检测

通俗理解

  1. 浏览器规定A网站的javascript不能与非同源的C网站进行资源交互
  2. 无法读取非同源网页的cookie、LocalStorage、IndexedDB
  3. 无法接触非同源网页的JSON
  4. 无法向非同源地址发送ajax请求

跨域

定义

当两个页面协议、域名‘、端口有一个或多个不一致时,则为跨域

浏览器对跨域请求的拦截

实现跨域的两种方法

  1. JSONP

出现的早,兼容性好(兼容低版本IE)。是前端程序员为了解决跨域问题,被迫想出来的一种临时解决方案。缺点是只支持 GET 请求,不支持 POST 请求

  1. CORS

出现的较晚,它是 W3C 标准,属于跨域 Ajax 请求的根本解决方案。支持 GET 和 POST 请求。缺点是不兼容某些低版本的浏览器。

自定义JSONP

<!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>jsonp</title>
</head>
<body><script>function success(data){console.log(data);}</script><script src="http://www.liulongbin.top:3006/api/jsonp?callback=success&name=ls&age=30"></script>
</body>
</html>

jQuery的JSONP

<script>$.ajax({method:"get",url:"http://www.liulongbin.top:3006/api/jsonp?&name=1&age=2",//jsonp必须定义dataTypedataType:"jsonp",//使用 jQuery 发起 JSONP 请求,会自动携带一个 callback=jQueryxxx 的参数,jQueryxxx 是随机生成的一个回调函数名称// 自定义的回调函数名称,默认值为 jQueryxxx 格式jsonpCallback: 'abc',success:function(data){console.log(data);}});
</script>

防抖与节流

防抖

防抖策略(debounce)是当事件被触发后,延迟 n 秒后再执行回调,如果在这 n 秒内事件又被触发,则重新计时。

<!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><!-- 引入template模板引擎 --><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 class="suggest-list"></div></div></div><!-- 页面模板 --><script  type="text/html" id="suggestList">{{each result}}<div class="suggest-item">{{$value[0]}}</div>{{/each}}</script><script>$(function(){//定时器idvar timer = null;//建议列表缓存对象var cacheObj = {}//防抖函数function debounce(kw){timer = setTimeout(function(){getSuggestList(kw)},500);}//输入触发事件$("#ipt").on('keyup',function(){clearTimeout(timer);var keywords = $(this).val().trim();if(keywords.length<=0){return $('.suggest-list').empty().hide();}//当缓存对象存在这个keywords 则直接从缓存对象中提取数据if(cacheObj[keywords]){return renderSuggestList(cacheObj[keywords]);}//调用防抖函数debounce(keywords);});//获取建议搜索列表数据函数function getSuggestList(kw){$.ajax({url:'https://suggest.taobao.com/sug?q='+kw,dataType:'jsonp',success:function(res){// console.log(res);renderSuggestList(res);}})}//渲染页面function renderSuggestList(res){//判断是否有获取到数据 没有则隐藏建议列表if(res.result.length<=0){return $('.suggest-list').empty().hide();}var htmlStr = template('suggestList',res);$('.suggest-list').html(htmlStr).show();var k =$('#ipt').val().trim();cacheObj[k]=res;}})</script></body>
</html>

节流

节流策略(throttle),顾名思义,可以减少一段时间内事件的触发频率。
主要应用场景
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>节流</title><script src="./淘宝搜索案例/lib/jquery.js"></script><style>html,body{margin: 0;padding: 0;}#angel{position: absolute;transform: translate(-30%,-50%);}</style>
</head>
<body><img src="angel.gif" alt="" id="angel"><script>$(function(){//节流阀var timer = null;$(document).on('mousemove',function(e){// 当节流阀不为null时,不再重复执行定时函数if(timer){return}timer = setTimeout(function(){console.log('ok');$('#angel').css('top',e.pageY+'px').css('left',e.pageX+'px');timer = null;},16)})})</script>
</body>
</html>

总结

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

JavaScript 同源策略 跨域 JSONP CORS 防抖和节流相关推荐

  1. 跨域-(jsonp cors)

    同源策略它是由NetScape提出的一个著名的安全策略. 浏览器执行js,会检查它属于哪个页面,如果不是同源页面,不会被执行. 由于浏览器的同源策略,只要发送请求url与页面地址有不同的即为跨域.只要 ...

  2. python全栈开发103_python全栈开发day103-python垃圾回收机制、mro和c3算法解析、跨域jsonp\CORS、Content-Type组件...

    Python垃圾回收 -- 引用计数 -- Python为每个对象维护一个引用计数 -- 当引用计数为0的 代表这个对象为垃圾 -- 标记清除 -- 解决孤立的循环引用 -- 标记根节点和可达对象 - ...

  3. AJAX | 跨域与JSONP + 同源策略和跨域 + JSONP + 防抖和节流 + 案例 – 淘宝搜索

    目录 同源策略和跨域 同源策略 跨域 JSONP JSONP的实现原理 自己实现一个简单的JSONP JSONP的缺点 jQuery中的JSONP 自定义参数及回调函数名称 jQuery中JSONP的 ...

  4. Ajax(jQuery封装),表单form提交(Ajax),art-template模板引擎,原生Ajax,XML和JSON,axios,跨域和JSONP,防抖和节流,HTTP协议

    目录 服务器基本概念 1.URL 2.URL地址的组成部分 3. 图解客户端与服务器的通信过程 4.网页中如何请求数据 5.资源的请求方式 Ajax jQuery中的Ajax 1. $.get()函数 ...

  5. 【JavaScript】同源、跨域

    文章目录 同源策略 跨域 CORS JSONP JSONP概述 JSONP的简单实现 同源策略 同源政策是由Netscape提出的一个著名的安全策略. 所有支持JavaScript的浏览器都会使用这个 ...

  6. 从零开始学 Java - Spring MVC 实现跨域资源 CORS 请求

    论职业的重要性 问:为什么所有家长都希望自己的孩子成为公务员? 答:体面.有权.有钱又悠闲. 问:为什么所有家长都希望自己的孩子成为律师或医生? 答:体面.有钱.有技能. 问:为什么所有家长都不怎么知 ...

  7. AJAX——同源与跨域2

    参考链接:https://www.cnblogs.com/sdcs/p/8484905.html 1. 什么是跨域? 跨域是指一个域下的文档或脚本试图去请求另一个域下的资源,这里跨域是广义的. 广义的 ...

  8. Spring全家桶-Spring Security之跨域与CORS与防护

    Spring全家桶-Spring Security之跨域与CORS Spring Security是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架.它提供了一组可以 ...

  9. 跨域资源共享CORS详解

    最近深入了解了CORS的相关东西,觉得阮一峰老师的文章写得最详细易懂了,所有转载作为学习笔记. 原文地址:跨域资源共享 CORS 详解 CORS是W3C的一个标准,全称是跨域资源共享(Cross-or ...

最新文章

  1. 小程序云开发更新数组的指定对象的值
  2. Python单例模式的四种创建方式实例解析
  3. Saving James Bond - Easy Version 原创 2017年11月23日 13:07:33
  4. mysql一条sql更新多条数据_执行一条sql语句update多条记录实现思路
  5. 同事乱用 Redis 卡爆,我真是醉了
  6. 笔记本电脑怎么录制屏幕
  7. mysql 多选数据类型_【多选题】Mysql定点数数据类型包括( )。【本题2项正确】...
  8. MATLAB图像复原系统
  9. JS实现FlyBird
  10. windows是第几代计算机,第几代cpu不支持win7?全面分析第几代cpu不支持win7
  11. 图像标记img的alt属性
  12. 网页无法复制文字,一个插件解决问题!!!!
  13. Ribbon原理及使用详解
  14. python numpy中的矩阵、向量的加减乘除
  15. 利用数学软件Maxima求解电路的传递函数
  16. HEG安装教程以及闪退问题解决
  17. FPGA中en-rdy机制和req-ack机制的区别
  18. golang开发工程师-第一步:golang入门基础教学
  19. 使用Godaddy续费我的域名时遇到支付问题
  20. Android 顶部菜单栏 定义背景图片

热门文章

  1. pg_class(一)
  2. Matplotlib中修改坐标轴刻度线的属性
  3. 极简主义_网页设计中功能极简主义的真实性要少得多
  4. Android WorkManager
  5. top(topas),vmstat,iostat在linux和AIX操作系统下显示情况
  6. 在PHP中如何predis
  7. eclipse快捷键总结(部分含实例)
  8. 17086 字典序的全排列
  9. 刚融资的作业帮押宝浣熊英语 少儿英语赛道还有机会吗?
  10. 沧小海详解面试的必答题——I2C协议