js防抖和节流 区别及实现方式,什么是防抖和节流?有什么区别?如何实现?
本教程运行环境:windows7系统,javascript1.8.5版本1.8.5,戴尔G3电脑。
一、防抖
触发高频事件后n秒内函数只会执行一次,如果n秒内高频事件再次被触发,则重新计算时间
想法:
动作绑定事件,动作发生一定时间后触发事件。在这段时间内,如果动作再次发生,等待一定时间后再触发事件。功能去抖(fn) {
设timeout=null//创建一个标志来保存计时器的返回值。
返回函数(){
clearTimeout(超时);
//每当用户输入SetTimeout时,清除以前的SetTimeout。
timeout=setTimeout(()={
//然后创建一个新的setTimeout,从而保证输入字符后的间隔
//如果仍有字符输入,则不会执行fn函数
fn.apply(this,arguments);
//因为sayHi函数是全局运行的,所以这个默认指向window。
//所以使用apply来传入inp的这个
}, 500);
};
}
函数sayHi() {
Console.log(防抖成功);
}
var InP=document . getelementbyid( InP );
inp.addEventListener(input ,de bounce(say hi));//防抖。比如你有一个要求,用户在输入框中输入一串字符后自动发送一个ajax请求,如果不做防抖,用户每次改变字符串(删除字符或者输入新字符)都会发送一个请求。但如果做了防抖,当用户输入一个字符,0.5秒后没有改变字符串(这个大概率表示用户已经输入完字符串),请求就会发出。如果字符串在0.5秒内被更改(这种高概率表示当前字符串不是用户要输入的最终字符串),则不会发送请求,重新计算将持续0.5秒,直到用户在发送请求前暂停0.5秒以上。
二、节流
当持续触发事件时,保证一定时间段内只调用一次事件处理函数。所以节流会稀释函数的执行频率
想法:
动作绑定事件,事件在一定时间后触发事件。在此期间,如果一个动作再次发生,该动作将被忽略,直到它完成,该事件才会被再次触发。功能油门(fn) {
设canRun=true//通过闭包保存标记
返回函数(){
如果(!canRun)返回;//在函数开始时判断标志是否为真,不为真则返回。
canRun=false//立即设置为false
SetTimeout(()={//将外部传入函数的执行放在SetTimeout中。
fn.apply(this,arguments);
//最后,setTimeout结束后将标志设置为true (critical)表示下一次可以执行。
//循环了。当定时器不运行时,标志总是为假,并在开始时返回。
canRun=true
}, 500);
};
}
函数sayHi(e) {
console . log(e . target . inner width,e . target . inner height);
}
window . addevent listener( resize ,throttle(say hi));
三、结合应用场景
debounce(防抖)
搜索关联,用户连续输入值时,使用防抖节省请求资源。
当触发窗口大小调整时,不断调整浏览器窗口大小将会不断触发此事件。使用防抖使其仅触发一次。throttle(节流)
连续点击鼠标触发,mousedown(每单位时间仅一次)
监听滚动事件,比如是否滑到底部自动加载更多,用throttle来判断。
【推荐学习:javascript高级教程】以上是javascript中什么是防抖和节流的详细内容。更多请关注我们的其他相关文章!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。