弾き返しと弾き返し
使用する理由
スクロール、サイズ変更、入力、mouseoverなどのイベントは短時間で複数回発生し、パフォーマンスの問題を引き起こす可能性があります.discountsおよびthrottleは、短時間間隔で連続的に発生するイベントをグループ化することによって、過剰なイベント呼び出しを阻止する.
サンプルコードの設定
簡単な例でその働き方を理解しましょう.一般クリック、後退クリック、手書きクリックを使用して区別し、クリック数に応じて変化を表示します.
フレームワークコードは次のとおりです.
<!DOCTYPE html>
<html>
<body>
<button>click</button>
<div>
<pre>일반 클릭: <span class="normal">0</span></pre>
<pre>디바운스 클릭: <span class="debounce">0</span></pre>
<pre>스로틀 클릭: <span class="throttle">0</span></pre>
</div>
<script>
const $button = document.querySelector("button");
const $normal = document.querySelector(".normal");
const $debounce = document.querySelector(".debounce");
const $throttle = document.querySelector(".throttle");
$button.addEventListener("click", () => {
$normal.textContent = Number($normal.textContent) + 1;
console.log('normal');
});
</script>
</body>
</html>
現在は通常クリックのカウントのみが行われています.返品
disbounceは、短時間で発生したイベントをグループ化し、イベントハンドラが最後のイベントのみを呼び出すようにします.すなわち、イベントが連続的に発生すると、デバッガはイベントハンドラを呼び出さず、一定期間イベントが発生しない場合、イベントハンドラを呼び出す.
<!DOCTYPE html>
<html>
<body>
<button>click</button>
<div>
<pre>일반 클릭: <span class="normal">0</span></pre>
<pre>디바운스 클릭: <span class="debounce">0</span></pre>
<pre>스로틀 클릭: <span class="throttle">0</span></pre>
</div>
<script>
const $button = document.querySelector("button");
const $normal = document.querySelector(".normal");
const $debounce = document.querySelector(".debounce");
const $throttle = document.querySelector(".throttle");
const debounce = (callback, delay) => {
let timerId;
//timerId를 기억하는 클로져를 반환한다.
return (e) => {
//delay가 끝나기전 다시 호출 되었을 경우, 타이머를 취소하고 새로운 타이머를 설정한다.
//delay가 끝날때까지 호출이 되지 않으면 callback함수를 실행한다.
if (timerId) clearTimeout(timerId);
timerId = setTimeout(callback, delay, 'debounce 실행');
};
};
$button.addEventListener("click", () => {
$normal.textContent = Number($normal.textContent) + 1;
console.log('normal');
});
//debounce 함수가 반환하는 클로져를 이벤트 핸들러로 등록한다.
$button.addEventListener("click", debounce((message)=>{
$debounce.textContent = Number($debounce.textContent) + 1;
console.log(message);
},500));
</script>
</body>
</html>
Debonse関数から返されるカーネルをイベントハンドルとして登録します.これは,モジュールの特性を利用して,イベントが複数回呼び出されたときに以前のtimerIdを記憶するためである.イベントが呼び出されたときに前のtimerIdが存在するかどうかを判断した場合は、タイマを削除し、新しいタイマを設定します.ない場合は、新しいタイマーのみを設定します.delayに設定された時間内にdebonse関数が呼び出されない場合はcallbabk関数が呼び出されます.実行結果は次のとおりです.resizeイベントの処理、入力に応じてajaxリクエストの自動完了、ボタンの重複クリックの防止などに使用できます.
斜紋布
Throtlingは、イベントハンドラを一定期間呼び出すために、短時間でイベントをグループ化する.ハーモニーを見て!長いようですが、変わった部分は多くありません.throttle関数と呼び出しの部分が追加されました.
<!DOCTYPE html>
<html>
<body>
<button>click</button>
<div>
<pre>일반 클릭: <span class="normal">0</span></pre>
<pre>디바운스 클릭: <span class="debounce">0</span></pre>
<pre>스로틀 클릭: <span class="throttle">0</span></pre>
</div>
<script>
const $button = document.querySelector("button");
const $normal = document.querySelector(".normal");
const $debounce = document.querySelector(".debounce");
const $throttle = document.querySelector(".throttle");
const debounce = (callback, delay) => {
let timerId;
//timerId를 기억하는 클로져를 반환한다.
return (e) => {
//delay가 끝나기전 다시 호출 되었을 경우, 타이머를 취소하고 새로운 타이머를 설정한다.
//delay가 끝날때까지 호출이 되지 않으면 callback함수를 실행한다.
if (timerId) clearTimeout(timerId);
timerId = setTimeout(callback, delay, 'debounce 실행');
};
};
const throttle = (callback, delay) => {
let timerId;
//timerId를 기억하는 클로져를 반환한다.
return (e) => {
//delay가 끝나기전 다시 호출 되었을 경우, 아무일도 하지않는다.
//delay가 지나면 callback함수를 실행하고 timerId를 null로 만들어 새로운 타이머를 설정할 수 있도록 한다.
if(timerId) return;
timerId = setTimeout((message)=>{
callback(message);
timerId= null;
}, delay, 'throttle 실행')
}
}
$button.addEventListener("click", () => {
$normal.textContent = Number($normal.textContent) + 1;
console.log('normal')
});
//debounce 함수가 반환하는 클로져를 이벤트 핸들러로 등록한다.
$button.addEventListener("click", debounce((message)=>{
$debounce.textContent = Number($debounce.textContent) + 1;
console.log(message);
},500));
//throttle 함수가 반환하는 클로져를 이벤트 핸들러로 등록한다.
$button.addEventListener("click", throttle((message)=>{
$throttle.textContent = Number($throttle.textContent) + 1;
console.log(message);
},500))
</script>
</body>
</html>
リバウンドと方式の差は多くない.以前のtimerIdを覚えるために、閉パッケージを返しました.CloserではtimerIdが存在する場合はclearではなく何もしません.次にsettimeOutの実行部でdelayの後にコールバックを実行し、timerIdを空にします.これにより、関数が再実行されると、タイマが再設定されます.これにより、コールバックは最終的に設定された遅延間隔で呼び出されます.実行結果は次のとおりです.回転は、スクロールイベント処理や無限スクロールなどに使用できます.
Reference
この問題について(弾き返しと弾き返し), 我々は、より多くの情報をここで見つけました https://velog.io/@qudgus21/디바운스와-쓰로틀링テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol