防抖策略(debounce)
当事件被触发后,延迟n秒后再执行回调,如果在这n秒内事件又被触发,则重新计时。
通俗理解(LOL中的回城机制,在施法的时候不可以被打断,不然重新施法)
好处:能够保证用户在频繁触发某些事件的时候,不会频繁的执行回调,只会被执行一次
举个爪:实现输入框的防抖
//防抖动的timer
//定义防抖动的函数,函数里面定义一个延时器,在延时器里面调用发起JSON的请求
//在触发keyup事件时,立即清空timer,然后调用防抖的函数
var timer = null // 1. 防抖动的 timer
function debounceSearch(keywords) { // 2. 定义防抖的函数
timer = setTimeout(function() {
// 发起 JSONP 请求
getSuggestList(keywords)
}, 500)
}
$('#ipt').on('keyup', function() { // 3. 在触发 keyup 事件时,立即清空 timer
clearTimeout(timer)
// ...省略其他代码
// 为输入框绑定 keyup 事件
// $('#ipt').on('keyup', function () {
// 3. 清空 timer
// clearTimeout(timer)
// var keywords = $(this).val().trim()
// if (keywords.length <= 0) {
// return $('#suggest-list').empty().hide()
// }
// 先判断缓存中是否有数据
// if (cacheObj[keywords]) {
// return renderSuggestList(cacheObj[keywords])
// }
// TODO:获取搜索建议列表
// console.log(keywords)
// getSuggestList(keywords)
debounceSearch(keywords)
})
节流策略(throttle)
可以减少一段时间内事件触发的频率。
节流的应用场景
① 鼠标连续不断地触发某事件(如点击),只在单位时间内只触发一次;
② 懒加载时要监听计算滚动条的位置,但不必每次滑动都触发,可以降低计算的频率,而不必去浪费 CPU 资源;
③通俗理解:王者荣耀中的平A,有个攻速限制,按得再快也没有。
节流阀
字面上理解就是一个开关,也只是一个优化的作用。
举个爪:使用节流阀优化鼠标跟随效果
- 预定义一个 timer 节流阀
- 当设置了鼠标跟随效果后,清空 timer 节流阀,方便下次开启延时器
- 执行事件的时候判断节流阀是否为空,如果不为空,则证明距离上次执行间隔不足16毫秒
$(function() {
var angel = $('#angel')
var timer = null // 1.预定义一个 timer 节流阀
$(document).on('mousemove', function(e) {
if (timer) { return } // 3.判断节流阀是否为空,如果不为空,则证明距离上次执行间隔不足16毫秒
timer = setTimeout(function() {
$(angel).css('left', e.pageX + 'px').css('top', e.pageY + 'px')
timer = null // 2.当设置了鼠标跟随效果后,清空 timer 节流阀,方便下次开启延时器
}, 16)
})
})
防抖与节流的区别
-
防抖:如果事件被频繁触发,防抖能保证只有最有一次触发生效!前面 N 多次的触发都会被忽略!
-
节流:如果事件被频繁触发,节流能够减少事件触发的频率,因此,节流是有选择性地执行一部分事件!