正常,节流,防抖区别演示
节流:
特点:如果这个事件会被频繁触发,那么节流函数会按照一定的频率来执行函数,不管在这个中间有多少次触发这个事件,执行函数的频次总是固定的;
应用场景:
游戏中的一些设计--王者荣耀 英雄的普攻;
监听页面的滚动事件;
鼠标移动事件;
用户频繁点击按钮操作;
实现方式:
//第三方库实现
<input type="text"> <!--html标签-->
<script src="https://cdn.jsdelivr.net/npm/underscore@1.13.1/underscore-umd-min.js"></script>
<script>
const inputEl = document.querySelector("input")
let counter = 0
const inputChange = function(event) {
console.log(`发送了第${++counter}次网络请求`, this, event)
}
// 节流处理
inputEl.oninput =_.throttle(inputChange, 2000)//当用户不断触发事件按照2秒的频率执行
</script>
//手动实现
//js 封装throttle方法
function throttle(fn, interval, options) {
// 1.记录上一次的开始时间
let lastTime = 0
// 2.事件触发时, 真正执行的函数
const _throttle = function(e) {
// 2.1.获取当前事件触发时的时间
const nowTime = new Date().getTime()
// 2.2.使用当前触发的时间和之前的时间间隔以及上一次开始的时间, 计算出还剩余多长事件需要去触发函数
const remainTime = interval - (nowTime - lastTime)
if (remainTime <= 0) {
// 2.3.真正触发函数
fn.apply(this,[e])
// 2.4.保留上次触发的时间
lastTime = nowTime
}
}
return _throttle
}
//使用位置
<body>
<input type="text">
</body>
<script src="./jieliu.js"></script>
<script>
const inputEl = document.querySelector('input')
let counter = 0
const inputChange = function (e) {
console.log(`发送了${++counter}次网络请求`, this, e);
}
inputEl.oninput = throttle(inputChange, 2000)
</script>
防抖:
特点:当事件触发时,相应的函数并不会立即触发,而是会等待一定的时间(非常短的时间),当事件密集触发时,函数的触发会被频繁的推迟,只有等待了一段时间也没有事件触发,才会真正的执行响应函数
应用场景:
输入框中频繁的输入内容,搜索或者提交信息;
频繁的点击按钮,触发某个事件;
监听浏览器滚动事件,完成某些特定操作;
用户缩放浏览器的resize事件;
实现方式:
//第三方库实现
<input type="text"> <!--html标签-->
<script src="https://cdn.jsdelivr.net/npm/underscore@1.13.1/underscore-umd-min.js"></script>
<script>
const inputEl = document.querySelector("input")
let counter = 0
const inputChange = function(event) {
console.log(`发送了第${++counter}次网络请求`, this, event)
}
// 防抖处理
inputEl.oninput = _.debounce(inputChange, 2000)//当用户停止输入的时候延时2秒后执行
</script>
//手动实现
//js 封装debounce方法
function debounce(fn,timeout) {
var timer
return function(e) {
if(timer){
clearTimeout(timer)
}
timer = setTimeout(()=>{
fn.apply(this,[e])
},timeout)
}
}
//使用位置
<body>
<input type="text">
</body>
<script src="./fangdou.js"></script>
<script>
const inputEl = document.querySelector('input')
let counter = 0
const inputChange = function(e) {
console.log(`发送了${++counter}次网络请求`,this,e);
}
inputEl.oninput = debounce(inputChange,1000)
</script>