节流
一、js函数节流
1.介绍:函数节流简单讲就是让一个函数无法在很短的时间间隔内连续调用,只有当上一次函数执行后过了你规定的时间间隔,才能进行下一次该函数的调用。
2.函数节流原理:用定时器,当触发一个事件时,先setTimout让这个事件延迟一会再执行,如果在这个时间间隔内又触发了事件,那我们就clear掉原来的定时器,再setTimeout一个新的定时器延迟一会执行。
大家应该听说过阿里做了一个抢购月饼的活动,一个内部的员工,使用了恶意脚本,抢了很多的月饼,最终导致被开除~ 其实对它未必是坏事,因为在他离开阿里之后,不知道有多少公司对他招手~ 注:希望这次不要给我删帖了~每次打上去很不容易的
不多说了,看一个案例把~
分析:有一家公司做一个活动,在规定时间可以抢购商品,每次点击一次,数量增加一个。
1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta charset="UTF-8"> 5 <title></title> 6 </head> 7 <body> 8 <div id="show">1</div> 9 <button id="btn">点击抢购</button> 10 </body> 11 <script type="text/javascript"> 12 var oDiv=document.getElementById("show"); 13 var oBtn=document.getElementById("btn"); 14 oBtn.onclick=function(){ 15 oDiv.innerText=parseInt(oDiv.innerText)+1; 16 } 17 </script> 18 </html>
这就是一个简单的点击事件,每次点击商品的数量都会增加一个,但是这样写真的好么? 上面说过有程序猿用恶意脚本修改商品数量~ 看下面代码
1.这是正常点击的情况~
2.一但使用了恶意脚本,就会直接对商品数量直接修改~
一但使用了这种恶意脚本,商品数量就会强制被修改。那么该如何防治这种事件发生呢?这时候就要用到节流的思想,在规定时间内,函数只能执行一次~代码如下
1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta charset="UTF-8"> 5 <title></title> 6 </head> 7 <body> 8 <div id="show">1</div> 9 <button id="btn">点击抢购</button> 10 </body> 11 <script type="text/javascript"> 12 var oDiv = document.getElementById("show"); 13 var oBtn = document.getElementById("btn"); 14 function throttle(handler, wait) { 15 var lastTime = 0; 16 return function(e) { 17 var nowTime = new Date().getTime(); 18 if(nowTime - lastTime > wait) { 19 handler.apply(this, arguments); 20 lastTime = nowTime; 21 } 22 } 23 } 24 function buy(e) { 25 oDiv.innerText = parseInt(oDiv.innerText) + 1; 26 } 27 oBtn.onclick = throttle(buy, 100); 28 </script> 29 </html>
如下图:
这样修改过后就可以防止商品数量被修改了~