防抖与回流
防抖策略:
当事件被触发后,延迟n秒后执行回调,如果在这n秒内事件又被触发,则重新计时
实现输入框防抖:
1.定义防抖的id
var timer = null;
2.定义防抖函数
function de (keywords){
timer = setTimeout(function(){
getSuggestList(keywords)
},500}
}
3.调用函数
$('#ipt').on('keyup',function(){
clearTimeout(timer)
de(keywords)
}
实质就是先定义一个函数,延迟发送JSONP请求,在这个时间段内再次触发keyup事件就把timer清空掉
节流策略:
减少一段时间内事件的触发频率
应用场景
连续点击鼠标,但是单位时间内只触发一次
节流阀:
节流阀就相当于上卫生间外面挂的牌子,有人表示被占用,无人表示可以使用
节流阀为空,表示可以执行下一次操作,不为空,表示不能执行
当前操作执行完,必须将节流阀重置为空,表示可以执行下一次操作
每次执行操作前,必须判断节流阀是否为空
代码示例
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
<script src="./lib/jquery.js"></script>
<style>
html,
body {
margin: 0;
padding: 0;
overflow: hidden;
}
#angel {
position: absolute;
}
</style>
</head>
<body>
<img src="./angel.gif" alt="" id="angel" />
<script>
$(function () {
// 1. 获取到图片
var angel = $('#angel')
// 步骤1. 定义节流阀
var timer = null
// 2. 绑定 mousemove 事件
$(document).on('mousemove', function (e) {
// 步骤3:判断节流阀是否为空
if (timer) { return }
// 3. 设置图片的位置
// 步骤2:开启延时器
timer = setTimeout(function () {
$(angel).css('top', e.pageY + 'px').css('left', e.pageX + 'px')
console.log('ok')
timer = null
}, 16)
})
})
</script>
</body>
</html>