JavaScript
防抖和节流
JavaScript
防抖和节流
JavaScript
防抖和节流
防抖:
所谓防抖,就是指触发事件后在 n 秒内函数只能执行一次,如果在 n 秒内又触发了事件,则会重新计算函数执行时间
节流:
所谓节流,就是指连续触发事件但是在 n 秒中只执行一次函数
防抖
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| <input type="text" id="fei_input">
<script> const feiInput = document.getElementById('fei_input'); let timer = null; feiInput.addEventListener('keyup', function () { if (timer) { clearTimeout(timer); } timer = setTimeout(() => { console.log(feiInput.value); timer = null; }, 500); }); </script>
|
简单封装一下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| <input type="text" id="fei_input">
<script> function debounce(fn, delay) { let timer = null;
return function () { if (timer) { clearTimeout(timer); } timer = setTimeout(() => { fn.apply(this, arguments); timer = null; }, delay); }; }
const feiInput = document.getElementById('fei_input'); feiInput.addEventListener('keyup', debounce(() => { console.log(feiInput.value); }, 500) ); </script>
|
节流
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| <div id="fei_div" draggable="true" style="width: 50px;height: 50px;border: 2px solid #ff6b81"></div>
<script> const feiDiv = document.getElementById('fei_div'); let timer = null; feiDiv.addEventListener('drag', function (e) { if (timer) { return; } timer = setTimeout(() => { console.log(e.offsetX, e.offsetY); timer = null; }, 2000); }); </script>
|
简单封装一下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| <div id="fei_div" draggable="true" style="width: 50px;height: 50px;border: 2px solid #ff6b81"></div>
<script> function throttle(fn, delay = 100) { let timer = null; return function () { if (timer) { return; } timer = setTimeout(() => { fn.apply(this, arguments); timer = null; }, delay); }; } const feiDiv = document.getElementById('fei_div'); feiDiv.addEventListener('drag', throttle(function (e) { console.log(e.offsetX, e.offsetY); }, 2000) ); </script>
|