一:节流是预定义一个函数只有再大于等于执行周期时才执行周期内不执行。
使用场景:窗口调整(resize),页面滚动(scroll),疯狂点击(mousedown);
<div>0</div>
<button class="btn">sssss</button>
<script>
var btn=document.getElementsByClassName("btn")[0];
var div=document.getElementsByTagName("div")[0];
btn.onclick=throttle(add,5000);
function add(e){
console.log(this,e)
div.innerHTML=parseInt(div.innerHTML)+1;
}
function throttle(handler,wait){
var lasttime=0;
return function () {
var nowTime=new Date().getTime();
if(nowTime-lasttime>wait){
handler.apply(this,arguments);
lasttime=nowTime;
}
}
}
</script>
二:防抖就是在函数需要频繁触发情况时,只有足够空闲的时间,才执行一次。
场景:实时搜索(keyup),拖拽(mousemove)
<input type="text" id="search">
<p></p>
<script>
search.oninput=debounce(ajax,2000);
function ajax(e){
var p=document.getElementsByTagName("p")[0];
p.innerHTML=search.value;
}
function debounce(handler,delay){
var timer=null;
return function() {
var _self=this,_arg=arguments;
clearTimeout(timer);
timer=setTimeout(function(){
handler.apply(_self,_arg);
},delay);
}
}
</script>
Vue:
new Vue({
el:"#box",
data:{
data:"hello world",
msg:0,
numData:"10",
listtime:0
},
methods: {
throttle:function(handler,wite){
var currenttime=+new Date();
if(currenttime- this.listtime>wite){
handler.apply(null,arguments);
this.listtime=currenttime;
}
},
add:function(){
this.msg++;
},
debounce:function(handler,delay){
var timer=null;
return function(){
var _arg=arguments;
clearTimeout(timer);
timer=setTimeout(()=>{
handler.apply(this,_arg);
},delay);
}
},
selfinput:function(e){
console.log(e)
}
}
// template:"<div><p>{{numData}}</p><div>"
})