位置: IT常识 - 正文

ajax - 终结篇jsonp,防抖节流(ajax json请求)

编辑:rootadmin
今天是我们最后一天ajax的学习,这次学完总可以去vue了吧,我不信还有什么拦路石,先不说其他的先看看今天的内容。 1. 首先是同源策略,什么叫做同源? 如果两个页面的协议、域名、端口都相同的话,我们将这两个页面为同源。 那么什么同源策略呢? 是浏览器提供的一个安全功能,如果说两个页面不同源,那么A ...

推荐整理分享ajax - 终结篇jsonp,防抖节流(ajax json请求),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:ajax jsonp请求,ajax json解析,ajax+json,ajax如何解析json数据,有几种方法,ajax+json,ajax jsonp请求,ajax处理json,ajax处理json,内容如对您有帮助,希望把文章链接给更多的朋友!

今天是我们最后一天ajax的学习,这次学完总可以去vue了吧,我不信还有什么拦路石,先不说其他的先看看今天的内容。

1.

首先是同源策略,什么叫做同源?

如果两个页面的协议、域名、端口都相同的话,我们将这两个页面为同源。

那么什么同源策略呢?

是浏览器提供的一个安全功能,如果说两个页面不同源,那么A网站就无法读取B网站的cookie、localstorage、indexdb等;无法接触B网站的DOM;无法向B网站发送ajax请求

了解了同源与他相反的就是跨域,也就是上面说的协议。域名、端口只要有一个不满足那么他们就是跨域。

浏览器对跨域请求的拦截,我们是能够正常发起对服务器的请求的,服务器也能够感应到请求并将数据返回回来,但是就在临近城门的时候,在浏览器门口就被一个同源策略的门卫拦截住了,一生之敌。

那么既然如此如何来实现跨域的请求呢?有两个方式CORS和JSONP。

cors是w3c标准支持get和post

JSONP

原理:由于浏览器同源策略的限制,网页无法通过ajax请求非同源,但是script这个标签是不受限制的,所以可以通过src这个属性请求到非同源的script

实现::自己定义一个回调函数,然后通过另一个script标签的src属性来调用服务器和一些参数在这个参数里面callback=这个函数的名字就是你自己回调函数的名字然后后面跟上你自己的参数

<!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></head><body> <script> function fn(data) { console.log('调用成功'); console.log(data); } </script> <script src="http://www.liulongbin.top:3006/api/jsonp?callback=fn&name=张三&age=29&sex=男"></script></body></html>

JSONP的缺点就是他只支持get请求

ajax - 终结篇jsonp,防抖节流(ajax json请求)

2.

jQuery中的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>Document</title></head><body> <button>点击查看jsonp</button> <script src="../day01/lib/jquery.js"></script> <script> $('button').on('click', () => { $.ajax({ url : 'http://www.liulongbin.top:3006/api/jsonp?name=张三&age=29&sex=男', dataType : 'jsonp', jsonpCallback : 'fn', success : res => console.log(res) }) }) </script></body></html>

在这里面datatype必须制定,然后url中没有了callback,因为他会自己随机生成一个callback,你也可以自己修改,jsonpCallback是修改回调函数名字的,jsonp是修改callback的。

在jq中jsonp的一个运行过程也要知道一下,他其实也是依靠script标签来实现的,在请求的时候他会动态生成一个script标签在header,然后请求完成又会移出这个标签。

3.

这些都学完了就可以看到一个案例,模仿淘宝的搜索关键字案例

<!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> <!-- 3.1插入template 准备用到模板引擎 --> <script src="./lib/template-web.js"></script> <!-- 3.2定义ui结构 --> <script type="text/html" id="suggestList"> {{each result}} <div class="suggest-item">{{$value[0]}}</div> {{/each}} </script> <style> .suggest-list { display: none; border: 1px solid #ccc; } .suggest-item { padding-left: 5px; line-height: 30px; } .suggest-item:hover { cursor: pointer; background-color: #eee; } </style> </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 type="text" class="ipt" placeholder="请输入要搜索的内容" /><button class="btnSearch"> 搜索 </button> </div> <!-- 3.在搜索框下面添加一个盒子拿来装关键字列表 --> <div class="suggest-list"> </div> </div> </div> <script src="./lib/jquery.js"></script> <script src="./lib/index.js"></script> </body></html>

通过jsonp和前面说到的模板引擎来实现

$(function() { // 1.先获取输入框的文字 $('.ipt').on('keyup', function(e) { let iptText = $(this).val().trim() if (iptText == '') { // 4.搜索关键词为空时需要隐藏搜索列表 return $('.suggest-list').empty().hide() } else { // 2.1调用获取关键字函数 getSearchList(iptText) } }) // 2.封装获取建议列表的函数 function getSearchList(text) { $.ajax({ url : 'http://suggest.taobao.com/sug?q='+text+'', dataType : 'jsonp', success : res => { getHtml(res) } }) } // 3.3调用函数并渲染 function getHtml(res) { if (res.result.length <= 0) { return $('.suggest-list').empty().hide() } else { let htmlStr = template('suggestList', res) console.log(htmlStr); $('.suggest-list').html(htmlStr).show() } }})

4.

防抖

防抖策略就是当一个事件被触发后,延迟几秒在执行回调函数,如果在这几秒内又被触发了,那么就会重新计时

主要应用场景在用户输入时连续输入一串字符,可以通过防抖策略只有在输入完毕过后再去执行查询的请求这样可以有效减少请求次数。

具体怎么来实现需要一个定时器,然后定义防抖函数,这个函数里面开启定时器获取jsonp数据渲染html都在这里面调用,在用户键盘事件这里清除定时器,输入一个清除一个输入一个清除一个,所以只要输入的够快,就达不到进入执行这个定时器的门槛,当你停下输入正常执行代码,就会开始执行定时器,去调用去请求去渲染

$(function() { // 防抖1 定义一个延时器 var timer = null // 防抖2 定义防抖函数 function debounceSearch(text) { timer = setTimeout(() => { getSearchList(text) }, 500); } // 1.先获取输入框的文字 $('.ipt').on('keyup', function(e) { // 防抖3一进来先清除定时器,按一下清一下 clearTimeout(timer) let iptText = $(this).val().trim() if (iptText == '') { // 4.搜索关键词为空时需要隐藏搜索列表 return $('.suggest-list').empty().hide() } else { // 2.1调用获取关键字函数 // getSearchList(iptText) // 防抖4 调用获取关键字函数由定时器执行相当于等你输完了在执行 debounceSearch(iptText) } }) // 2.封装获取建议列表的函数 function getSearchList(text) { $.ajax({ url : 'http://suggest.taobao.com/sug?q='+text+'', dataType : 'jsonp', success : res => { getHtml(res) } }) } // 3.3调用函数并渲染 function getHtml(res) { if (res.result.length <= 0) { return $('.suggest-list').empty().hide() } else { let htmlStr = template('suggestList', res) console.log(htmlStr); $('.suggest-list').html(htmlStr).show() } }})

缓存搜索

就是当我们输入一个数据的时候又添加一个关键字,然后删了有输入第一个关键字这个时候请求了三次,其中第一次和第三次是重复的,怎么解决

先定义一个全局的缓存对象,将搜索结果缓存到缓存对象中,优先从缓存中获取数据.

$(function() { // 防抖1 定义一个延时器 var timer = null // 防抖2 定义防抖函数 function debounceSearch(text) { timer = setTimeout(() => { getSearchList(text) }, 500); } // 缓存1 定义一个全局空对象 var resObj = {} // 1.先获取输入框的文字 $('.ipt').on('keyup', function(e) { // 防抖3一进来先清除定时器,按一下清一下 clearTimeout(timer) let iptText = $(this).val().trim() if (iptText == '') { // 4.搜索关键词为空时需要隐藏搜索列表 return $('.suggest-list').empty().hide() } else { // 缓存3 当我们输入值得时候就去判断一下有没有对象里有没有该值如果有那直接渲染就是不用再去请求数据 if (resObj[iptText]) { getHtml(resObj[iptText]) } else { // 2.1调用获取关键字函数 // getSearchList(iptText) // 防抖4 调用获取关键字函数由定时器执行相当于等你输完了在执行 debounceSearch(iptText) } } }) // 2.封装获取建议列表的函数 function getSearchList(text) { $.ajax({ url : 'http://suggest.taobao.com/sug?q='+text+'', dataType : 'jsonp', success : res => { console.log(res); getHtml(res) } }) } // 3.3调用函数并渲染 function getHtml(res) { if (res.result.length <= 0) { return $('.suggest-list').empty().hide() } else { let htmlStr = template('suggestList', res) // console.log(htmlStr); $('.suggest-list').html(htmlStr).show() // 缓存2 一切获取数据输入完毕在这里获取输入的最终值保存进对象里 resObj[$('.ipt').val().trim()] = res } }})

5.

节流

节流策略就是可以减少一段时间事件的触发频率,通过一个节流阀达到本不需要这么高的触发率,让资源空出来

<!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> <style> html,body { margin: 0; padding: 0; } img { position: absolute; } </style></head><body> <img src="./angel.gif" alt=""> <script> /* 普通版 var img = document.querySelector('img') document.onmousemove = function(e) { // console.log(11); img.style.left = e.pageX + 'px' img.style.top = e.pageY + 'px' } */ // 节流版 var img = document.querySelector('img') var timer = null document.onmousemove = function(e) { // console.log(11); if (timer) { return } else { timer = setTimeout(function() { img.style.left = e.pageX + 'px' img.style.top = e.pageY + 'px' timer = null },16) } console.log(11); } </script></body></html>
本文链接地址:https://www.jiuchutong.com/zhishi/311930.html 转载请保留说明!

上一篇:[Chrome插件开发]监听网页请求和响应(chrome插件开发拦截ajax)

下一篇:java基础-泛型与正则表达式(java泛型的定义和使用)

  • qq上网环境存在异常怎么解除(qq上网环境存在异常怎么解除手机)

    qq上网环境存在异常怎么解除(qq上网环境存在异常怎么解除手机)

  • 荣耀30pro支持电子书模式的吗(荣耀30pro支持充电)

    荣耀30pro支持电子书模式的吗(荣耀30pro支持充电)

  • 苹果手机灰色的图标怎么出来(苹果手机灰色的图标悬浮)

    苹果手机灰色的图标怎么出来(苹果手机灰色的图标悬浮)

  • iqoo的ai键有什么用(iqooz1ai按键是什么)

    iqoo的ai键有什么用(iqooz1ai按键是什么)

  • 微信发现视频号怎么弄(取消微信发现视频号)

    微信发现视频号怎么弄(取消微信发现视频号)

  • 小米mde40是什么机型(小米mde40是小米几)

    小米mde40是什么机型(小米mde40是小米几)

  • 微信信息拒收是什么意思(微信信息拒收是什么意思啊)

    微信信息拒收是什么意思(微信信息拒收是什么意思啊)

  • 小米m1804d2se是什么型号(小米m1804d2se是什么型号多少钱)

    小米m1804d2se是什么型号(小米m1804d2se是什么型号多少钱)

  • qq空间怎么发长视频(qq空间怎么发长图配音乐)

    qq空间怎么发长视频(qq空间怎么发长图配音乐)

  • 苹果网易云歌词怎么显示在手机屏幕上(苹果网易云歌词字体大小怎么改)

    苹果网易云歌词怎么显示在手机屏幕上(苹果网易云歌词字体大小怎么改)

  • 红米手机发烫怎么解决(红米手机发烫怎么办 只需一招轻松解决)

    红米手机发烫怎么解决(红米手机发烫怎么办 只需一招轻松解决)

  • 手机屏幕边上黑了一块(手机屏幕边上黑了一点怎么回事)

    手机屏幕边上黑了一块(手机屏幕边上黑了一点怎么回事)

  • 不支持7天无理由的可以退款吗(不支持7天无理由的类目)

    不支持7天无理由的可以退款吗(不支持7天无理由的类目)

  • 苹果手机拍照模糊会抖(苹果手机拍照模糊,人像功能清晰)

    苹果手机拍照模糊会抖(苹果手机拍照模糊,人像功能清晰)

  • 电脑不能解压文件怎么回事(电脑不能解压文件的原因)

    电脑不能解压文件怎么回事(电脑不能解压文件的原因)

  • qq里的自动回复可以续火花吗(QQ里的自动回复在哪里)

    qq里的自动回复可以续火花吗(QQ里的自动回复在哪里)

  • 有网为什么微信发不过去(有网为什么微信无法连接)

    有网为什么微信发不过去(有网为什么微信无法连接)

  • 替换操作在什么选项卡中(替换操作说法错误的是)

    替换操作在什么选项卡中(替换操作说法错误的是)

  • 华为手机有点卡怎么解决(华为手机有点卡反应慢怎么弄)

    华为手机有点卡怎么解决(华为手机有点卡反应慢怎么弄)

  • 在IE中播放多媒体文件的插件是(ie是一种播放软件可以播放扩展名为wam的文件)

    在IE中播放多媒体文件的插件是(ie是一种播放软件可以播放扩展名为wam的文件)

  • a1602是第几代(a1602是苹果几代)

    a1602是第几代(a1602是苹果几代)

  • cad布局比例怎么调(cad布局比例怎么设置)

    cad布局比例怎么调(cad布局比例怎么设置)

  • 老款车没蓝牙怎么听歌(老款车上没蓝牙怎么办)

    老款车没蓝牙怎么听歌(老款车上没蓝牙怎么办)

  • 苹果app自动扣费怎么取消(苹果App自动扣费是怎么回事)

    苹果app自动扣费怎么取消(苹果App自动扣费是怎么回事)

  • iphone11中国什么时候开售(苹果11中国什么时候出的)

    iphone11中国什么时候开售(苹果11中国什么时候出的)

  • ios12关闭软件下载密码(苹果手机关闭软件下载)

    ios12关闭软件下载密码(苹果手机关闭软件下载)

  • 淘宝怎么撤销投诉(淘宝怎么撤销投诉商家 手机淘宝举报投诉)

    淘宝怎么撤销投诉(淘宝怎么撤销投诉商家 手机淘宝举报投诉)

  • vim常用插件大全(vim8.2插件)

    vim常用插件大全(vim8.2插件)

  • 应交税费借方余额0.01怎么调整
  • 半成品可以计入成本吗
  • 房地产企业实收资本要求
  • 发票低于实际支付的金额如何做账
  • 火车票丢失怎么补办
  • 未满一年的公司可以注销吗
  • 增值税纳税申报表模板
  • 进项票丢了,假如税不抵了,怎么做账
  • 开出已验旧的发票怎么办
  • 应交税费销项税在借方还是贷方
  • 成品油经销企业开具的成品油电子专用发票
  • 分包工程违法吗
  • 商品流通企业成本核算的内容包括
  • 红字发票做进项转出还是红字负数
  • 长期挂账应付款的审计
  • 应收账款现金收回金额有限制嘛
  • 民间非营利组织会计制度
  • 社保费用可以税前扣除吗
  • 技术服务费可以计入研发费用吗
  • 企业股权溢价转让会计分录
  • 购销合同的会计分录怎么写
  • 股权购买会计分录
  • 二千万注册资金是多少
  • 成本和费用属于资产吗
  • 废旧物资回收企业税收管理
  • 以前年度损益申报怎么报所得税
  • 预计应收账款余额
  • 预付款退还的法律规定
  • 土地使用权转让协议
  • 财务收入怎么写
  • mac catalina系统怎么样
  • 服务业结转成本与收入如何配比
  • adb命令linux命令的区别
  • 饭店开业请客说什么
  • 发票金额与银行付款金额少几分钱
  • 脐橙产业可行性报告
  • 特许权使用费包括哪些内容
  • javascript bom dom
  • 工业企业采购流程
  • 一般纳税人开普票税率是3%还是13%
  • 财政补贴收入账务处理
  • 公司承担员工的社保费会计分录
  • 验证码php代码
  • mongodb如何修改数据
  • 小规模免税怎么做账务处理
  • 一般纳税人购销合同印花税减免政策
  • 哪些发票必须备注
  • 初识PostgreSQL存储过程
  • mysql怎么使用表
  • 出现什么情况企业不能持续经营
  • 待报解预算收入什么意思
  • 小型微利企业计算企业所得税
  • 应收代位追偿款有没有明细科目
  • 预付款开了发票
  • 记账凭证会计核算形式的程序
  • 预付账款用途
  • 分公司账务处理需要注意哪些
  • SSB(SQLservice Service Broker) 入门实例介绍
  • sql需要哪些基础
  • sql添加后返回主键
  • XP系统提示QQprotect.exe损坏文件的解决方法图文教程
  • centos7脚本
  • w7改w10硬盘怎么设置
  • linux的系统日志
  • windows8 defender
  • linux ssh -v -p
  • windows7出现错误恢复怎么办
  • 用python三角形
  • unity配置安卓sdk
  • linux sar文件路径
  • node.js gui
  • shell脚本语句
  • jquery示例
  • 如何使用nginx
  • input checked选择
  • 个人所得税完税证明网上打印
  • 四川税务2021
  • 减免税备案登记表样本
  • 怎样在网上申报税务流程
  • 江西省国家税务局网站
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设