防抖
原理:在事件被觸發(fā)n秒后再執(zhí)行回調(diào)勋篓,如果在這n秒內(nèi)又被觸發(fā)槐脏,則重新計(jì)時(shí)废离,最后一次有效。
適用場(chǎng)景:
- 按鈕提交場(chǎng)景:防止多次提交按鈕绍撞,只執(zhí)行最后提交的一次
- 服務(wù)端驗(yàn)證場(chǎng)景:表單驗(yàn)證需要服務(wù)端配合正勒,只執(zhí)行一段連續(xù)的輸入事件的最后一次,還有搜索聯(lián)想詞功能類似
<!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>
<style>
#iii,
#jjj {
height: 100px;
width: 200px;
background: lightblue;
margin-bottom: 10px;
}
</style>
</head>
<body>
<div id="jjj">防抖</div>
</body>
<script>
// 防抖
function debounce(fn, wait) {
let timeout = null;
return function () {
if (timeout !== null) clearTimeout(timeout);
timeout = setTimeout(fn, wait);
}
}
// 處理函數(shù)
function handle() {
console.log(Math.random());
}
var jjj = document.getElementById('jjj');
jjj.onclick = debounce.call(this, handle, 1000);
</script>
</html>
節(jié)流
解決問題:防止在單位時(shí)間內(nèi)多次觸發(fā)傻铣。例如拖拽
原理:規(guī)定在一個(gè)單位時(shí)間內(nèi)章贞,只能觸發(fā)一次函數(shù)。如果這個(gè)單位時(shí)間內(nèi)觸發(fā)多次函數(shù)非洲,只有一次生效鸭限。
<!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>
<style>
body {
height: 100000px;
}
</style>
</head>
<body>
打開控制臺(tái),滾動(dòng)屏幕
</body>
<script>
const throttle = (fn, delay = 500) => {
let flag = true;
return (...args) => {
if (!flag) return;
flag = false;
setTimeout(() => {
fn.apply(this, args);
flag = true;
}, delay);
};
};
// 處理函數(shù)
function handle() {
console.log(Math.random());
}
window.addEventListener('scroll', throttle(handle, 1000));
</script>
</html>
適用場(chǎng)景:
- 拖拽場(chǎng)景:固定時(shí)間內(nèi)只執(zhí)行一次两踏,防止超高頻次觸發(fā)位置變動(dòng)
- 縮放場(chǎng)景:監(jiān)控瀏覽器resize
- 動(dòng)畫場(chǎng)景:避免短時(shí)間內(nèi)多次觸發(fā)動(dòng)畫引起性能問題