setTimeout
これは、呼び出しの形で少しヒステリシスを組み込むことで実現できます。これは、繰り返しトリガーされる可能性のある高価な操作に対する典型的な応答です。が発生したら、keyup
(たとえば) 100 ミリ秒後にタイムアウトをスケジュールします。その 100 ミリ秒以内に別keyup
のタイムアウトが発生した場合は、以前のタイムアウトをキャンセルして、新しいタイムアウトを設定します。タイムアウトが発生したら、コストのかかる操作を実行します。
たとえば、以前のハンドラーが次のようになっているとします。
function handleKeyUp() {
doThisExpensiveThing();
doThatExpensiveThing();
doAnotherExpensiveThing();
}
...新しいものは次のようになります。
var keyupTimer = 0; // 0 is a safe "no timer" value, setTimeout never returns 0
function handleKeyUp() {
// Have an outstanding call?
if (keyupTimer) {
// Yes, clear it
clearTimeout(keyupTimer);
}
// Set a new call to occur in 100ms
keyupTimer = setTimeout(doExpensiveStuff, 100);
}
function doExpensiveStuff() {
// Clear the timer handle so we know we don't have a call pending
keyupTimer = 0;
// Do the expensive stuff
doThisExpensiveThing();
doThatExpensiveThing();
doAnotherExpensiveThing();
}