博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
js函数的节流与防抖
阅读量:5054 次
发布时间:2019-06-12

本文共 2534 字,大约阅读时间需要 8 分钟。

一、防抖&节流

  在前端开发中有一部分用户行为会频繁的触发事件执行,而对于DOM的操作、资源加载等耗费性能的处理,很可能会导致界面卡顿,甚至浏览器奔溃。函数的节流与防抖就是为了解决类似需求而产生的。

  1)节流

    概念:函数的节流就是预定一个函数只有在大于等于执行周期时才会执行,周期内调用不会执行。好像一滴水只有积攒到一定重量才会落下一样。

    场景:窗口调整(resize)、页面滚动(scroll)、抢购疯狂点击(movedown)

    故事:阿里巴巴月饼门事件,中秋来临,阿里特意做了一个活动,抢月饼,但是每个人只能抢购一盒,有五位工程师写了js脚本,类似于12306的抢票软件,直接刷了一百多盒月饼,结果被开除了四个.其实对于他们来说并不是什么坏事,不知道有多少公司对他们敞开大门~那么如何解决这种问题呢,就用到了函数的节流

  1.1)案例(限时抢购)

    我写了这样一个简单的事件,如下

HTML: 1 2 
0
JS: 1 let oBtn=document.getElementById('show')2 let oBox=document.getElementById('box')3 oBtn.οnclick=function(){4   oBox.innerText=parseInt(oBox.innerText)+15 }

    当我点击时,每点击一次,数量增加一,点击越快,增加越快,效果图如下:

    

  1.2)脚本攻击:这种简单的数量增加很容易遭到脚本的攻击,从而造成很大的损失。代码如下

    for(let i=0;i<100;i++){oBtn.click()}

    效果图如下:

    

  1.3)如何解决(节流)

    上面并不是我们想要的结果,我们想要的是在规定时间内只能执行一次,比如1秒内只能执行一次.无论你点击多少次.

HTML: 1 2 
0
JS:  1 let oBtn=document.getElementById('show'); 2     let oBox=document.getElementById('box'); 3     /* 4         handle:buy函数 5         wait:规定在一秒钟内只能执行一次 6     */ 7     function throttle (handle, wait) { 8         let lastTime = 0; 9         return function (e) {10             let nowTime = new Date().getTime()11             if (nowTime - lastTime > wait) {12                 handle();13                 lastTime = nowTime;14             }15         }16     }17     function buy(){18         oBox.innerText = parseInt(oBox.innerText)+119     }20     oBtn.onclick = throttle(buy, 1000)

    效果图如下:

    这样不仅可以达到想要的效果,还可以阻止恶意脚本的攻击.

  

  2.防抖

    概念:函数防抖就是函数需要频繁触发情况时,只有足够空闲的时候,才会执行一次。好像公交司机会等人都上车后才会开车一样.

    场景:实时搜索(keyup)、拖拽(mousemove)

    2.1).案例(实时搜索)

      在之前看一下这个过程图,百度的实时搜索.

 

      在搜索nba的时候,并不是每输入一个字符,都会想服务器请求一次,而是在输入完成后发出一次请求。

HTML: 1 
JS: 1 let oIpt = document.getElementById('ipt');2 function ajax () {3     console.log(this.value)4 }5 oIpt.oninput = ajax;

      效果图如下:

    用户无论输入多快,都会发出请求,从而去加载服务器资源,对性能有很大的影响.

    2.3)解决(防抖)

1 let oIpt = document.getElementById('ipt'); 2     let time = null; 3     function debounce (handle, delay) { 4         let time = null; 5         return function () { 6             let self = this,arg = arguments; 7             clearTimeout(time); 8             time = setTimeout(function () { 9                 handle.apply(self,arg);  //this绑定10             },delay)11         }12     }13     function ajax (e) {14         console.log(e,this.value)15     }16     oIpt.oninput = debounce(ajax, 1000)  //1s后发出请求

      效果图:

  这种方法可以解决多次请求的问题,对性能有很大的提高。

  喜欢的小伙伴点个关注哦~我会再接再厉的。

 

    

    

    

转载于:https://www.cnblogs.com/alongup/p/9261076.html

你可能感兴趣的文章
ysj的模拟赛
查看>>
[Java] Java 获取数据库所有表基本信息和表中的所有列基本信息代码
查看>>
[Hadoop 周边] Hadoop技术生态圈
查看>>
初识php
查看>>
看了很多人问香港10周年晚会上的开幕动画中的小猪麦兜为什么总问橡皮,写个小故事....
查看>>
POJ 3641:Pseudoprime numbers
查看>>
ubuntu 安装mysql
查看>>
2010年Oracle大事记
查看>>
hdu 2072 单词数
查看>>
tomcat 设置内存
查看>>
POJ2318 TOYS(点与凸多边形位置关系)
查看>>
Ajax异步获取html数据中包含js方法无效的解决方法
查看>>
做了一个无限评论,不知道咋样
查看>>
Highcharts属性中英文参照
查看>>
iOS应用程序多语言本地化
查看>>
memo用法总结
查看>>
AngularJs $watch监听模型变化
查看>>
1005 继续(3n+1)猜想 (25 分)
查看>>
多例设计模式
查看>>
c# await 到底等待的是什么?
查看>>