嘘~ 正在从服务器偷取页面 . . .

跨域与JSONP.md


前言

————同源策略,跨域,JSONP的实现原理,防抖和节流。

了解同源策略和跨域

同源指的是如果两个页面的协议,域名,端口都相同,则两个页面具有相同的源(如果没有给出端口号,默认是80端口)。

同源策略是浏览器提供的一个安全功能

跨域是指两个URL的协议,域名,端口有一个或一个以上不一致。出现跨域的根本原因:浏览器的同源策略不允许非同源的URL之间进行资源的交互
(浏览器允许发起跨域请求,但是,跨域请求回来的数据会被浏览器拦截,无法被页面获取到)

如何实现跨域数据请求解决方案:JSONP和CORS
JSONP:出现的早,兼容性好,缺点是只支持GET请求,不支持POST请求;
CORS:出现的较晚,W3C标准,两种请求都支持,缺点是不兼容低版本浏览器

JSONP的实现原理

JSONP的实现原理就是通过<script>标签的src属性,请求跨域的数据接口,并通过函数调用的形式,接收跨域接口响应回来的数据

jQuery中的JSONP

jQuery 提供的 $.ajax() 函数,除了可以发起真正的 Ajax 数据请求之外,还能够发起 JSONP 数据请求

$.ajax({
  url: 'http://ajax.frontend.itheima.net:3006/api/jsonp?name=zs&age=20',
  // 如果要使用 $.ajax() 发起 JSONP 请求,必须指定 datatype 为 jsonp
  dataType: 'jsonp',
   success: function(res) {
   console.log(res)
}
})

在使用 jQuery 发起 JSONP 请求时,如果想要自定义 JSONP 的参数以及回调函数名称,可以通过如下两个参数来指定:

$.ajax({
  url: 'http://ajax.frontend.itheima.net:3006/api/jsonp?name=zs&age=20',
  dataType: 'jsonp',
  // 发送到服务端的参数名称,默认值为 callback
  jsonp: 'callback',
  // 自定义的回调函数名称,默认值为 jQueryxxx 格式
  jsonpCallback: 'abc',
  success: function(res) {
  console.log(res)
}

})

jQuery中JSONP的实现过程

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

  • 在发起 JSONP 请求的时候,动态向 <header> 中 append 一个 <script> 标签;

  • 在 JSONP 请求成功以后,动态从 <header> 中移除刚才 append 进去的 <script> 标签;

防抖与节流

防抖

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

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

var timer = null                    // 1. 防抖动的 timer
  function debounceSearch(keywords) { // 2. 定义防抖的函数
  timer = setTimeout(function() {
  // 发起 JSONP 请求
  getSuggestList(keywords)
  }, 500)
  }

  $('#ipt').on('keyup', function() { 
  // 3. 在触发 keyup 事件时,立即清空 timer    
    clearTimeout(timer)
   debounceSearch(keywords)
})

缓存搜索的建议列表

1.定义全局缓存对象

// 缓存对象   var cacheObj = {}

2.将搜索结果保存到缓存对象中

 // 渲染建议列表
 function renderSuggestList(res) {
   // ...省略其他代码
   // 将搜索的结果,添加到缓存对象中
    var k = $('#ipt').val().trim()
    cacheObj[k] = res
 }

3.优先从缓存中获取搜索建议

 // 监听文本框的 keyup 事件
 $('#ipt').on('keyup', function() {
    // ...省略其他代码

    // 优先从缓存中获取搜索建议
    if (cacheObj[keywords]) {
       return renderSuggestList(cacheObj[keywords])
    }
    // 获取搜索建议列表
    debounceSearch(keywords)
  })

节流

节流策略 就是可以减少一段时间内事件的触发频率

节流的应用场景:

  • 鼠标连续不断地触发某事件,只在单位时间内只触发一次

  • 懒加载时要监听计算滚动条的位置,但不必每次滑动都触发,可以降低计算的频率,而不必去浪费cpu资源。

总结

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

文章作者: 哲哲
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 哲哲 !
 上一篇
HTTP协议 HTTP协议
HTTP协议简介什么是通信——通信就是信息的传递和交换 通信三要素:主体,内容,方式。 (服务器把张三的文章通过响应的方式发送给客户端浏览器)其中通信的主体是服务器和客服端浏览器,内容是张三的文章,方式是响应
下一篇 
MarkdownPad语法 MarkdownPad语法
前言 我之前记笔记一直用OneNote,但是年前心血来潮,就自己建了博客,想着把自己的学习心得发到博客上。但是博客算是完工了,但是写文章又成了一大难题,就自己在网上查找写博客的编辑器,发现用Markdown Pad来编写文章很方便。但是刚接
2022-02-14 哲哲
  目录