类似于游戏里的回城操作,一旦回城过程中再点一次回城就会停止上一次的延时及时,重新计时。
用户在输入框中连续输入一串字符时,可以通过防抖策略,只在输入完后,才执行查询请求,这样可以有效减少请求次数,节约请求资源
//1、定义延时器id
var timer = null
//2、定义防抖函数
function debounceSearch(kw){
timer = setTimeout(function(){
getSuggestList(kw)
},500)
}
//为输入绑定keyup事件
$('#ipt').on('keyup',function(){
//3、清空延时器
clearTimeout(timer)
var keywords = $(this).val().trim()
if(keywords.length <= 0){
return $('#suggest-lidt').empty().hide() //清空匹配的选项列表比哦钱中的内容并在页面隐藏
})
//4、调防抖函数
debounceSearch(keywords)
})
当用户多次输入相同的值时,会多次发送请求
$(function(){ //规范,可以不写
//1.定义全局缓存对象
var cacheObj = {}
//为输入绑定keyup事件
$('#ipt').on('keyup',function(){
clearTimeout(timer)
var keywords = $(this).val().trim()
if(keywords.length <= 0){
return $('#suggest-lidt'.empty().hide())
})
//5、先查缓存,如果有则直接渲染数据
if(cacheObj[keywords]){
return renderSuggestList(cacheObj[keywords])
}
debounceSearch(keywords)
})
//渲染函数
function renderSuggestList(res){
if(res.result.length <= 0){
return $('#suggest-list').empty().hide()
}
var htmlStr = template('tpl-suggestList',res)
$('#suggest-list').html(htmlStr).show()
//3、获取用户输入内容,当作键
var k = $('#ipt').val().trim()
//4、需要将数据作为值,进行缓存
cacheObj[k] = res
}
})
触发事件后会等待一段时间后再进行触发,在这个过程中,所有的触发操作都是无用的。减少事件触发频率,防止无限触发
鼠标连续不断的触发某事件,只在单位时间内触发一次
懒加载时要监听计算滚动条位置,但不必每次滑动都触发,可以降低计算频率。
节流阀相当于是一个状态值,节流阀为空表示可以执行下次操作,不为空,表示不能执行下次操作。当前操作完必须将节流阀置空,表示可以进行下次操作了,每次执行前都需要判断节流阀是否为空。
模拟鼠标跟随动画
$(function(){
var timer = null //定义节流阀
$(document).on('mousemove',function(e){ //给文档绑定一个鼠标移动事件
if (timer) { return } //判断节流阀是否为空
timer = setTimeout(function(e){
$('#angle').css('left',e.pageX+'px').css('top',e.pageY+'px') //动画跟随鼠标移动,事件对象中的形参e默认有坐标属性
timer = null //清空节流阀
},16)
})
})
防抖:如果事件被频繁触发,防抖能保证只有最后一次触发生效,前面的触发都会被忽略
节点:如果事件被频繁触发,节流能够减少事件触发频率,选择性的执行一部分事件。