スクリーニングイベントのページ性能への影響を防ぐ
11424 ワード
問題
scrollイベントは、ドキュメントまたはドキュメント要素のスクロール時にトリガされ、主にユーザがスクロールバーをドラッグします.
ソリューション
推奨された方法は、
request Animation Frame()
set Timeout()
スロットル
scrollイベントは、ドキュメントまたはドキュメント要素のスクロール時にトリガされ、主にユーザがスクロールバーをドラッグします.
window.addEventListener('scroll', callback);
このイベントは連続的に大量にトリガされるので、その傍受関数の中には非常に計算された操作があるべきではない.ソリューション
推奨された方法は、
requestAnimationFrame
またはsetTimeout
を使用してイベントのトリガ周波数を制御し、customEvent
に関連して新しいイベントをスローすることができる.request Animation Frame()
var throttle = function (type, name, obj) {
var obj = obj || window;
var running = false;
var func = function () {
if (running) { return; }
running = true;
requestAnimationFrame(function() {
obj.dispatchEvent(new CustomEvent(name));
running = false;
});
};
obj.addEventListener(type, func);
};
// scroll optimizedScroll
throttle('scroll', 'optimizedScroll');
})();
window.addEventListener('optimizedScroll', function() {
console.log('Resource conscious scroll callback!');
});
上記のコードでは、throttle
関数はイベントトリガ周波数を制御するために使用され、requestAnimationFrame
方法は、ページごとに書き換え(毎秒60回)、一回のscrollイベントの傍受関数のみをトリガすることを保証する.つまり、上記の方法は、scrollイベントのトリガ周波数を、毎秒60回に制限する.具体的には、scroll
イベントは、周波数が毎秒60回を下回ると、optimizedScroll
イベントをトリガし、optimizedScroll
イベントの傍受関数を実行する.set Timeout()
setTimeout
方法は、より大きな時間間隔を置くことができる.(function() {
window.addEventListener('scroll', scrollThrottler, false);
var scrollTimeout;
function scrollThrottler() {
if (!scrollTimeout) {
scrollTimeout = setTimeout(function () {
scrollTimeout = null;
actualScrollHandler();
}, 66);
}
}
function actualScrollHandler() {
// ...
}
}());
上記のコードでは、scrollイベント毎にscrollThrottler
関数が実行される.この関数には、66ミリ秒ごとに実行されるタスクsetTimeout
があります.スロットル
function throttle(fn, wait) {
var time = Date.now();
return function() {
if ((time + wait - Date.now()) < 0) {
fn();
time = Date.now();
}
}
}
window.addEventListener('scroll', throttle(callback, 1000));
上のコードはscrollイベントのトリガ周波数を一秒に一回に制限します.actualScrollHandler
関数ライブラリは、既存のlodash
関数を提供しており、直接使用することができる.window.addEventListener('scroll', _.throttle(callback, 1000));
知識開拓throttle
とdebounce
のは別です.throttle
は「節流」であり、一定期間に一回しか実行しないことを確保し、throttle
は「手ぶれ防止」であり、連続操作が終了したら実行する.ウェブページのスクロールを例にとって、debounce
はユーザがローリングを停止した後に実行し、debounce
はユーザがウェブページをローリングしている場合、ローリング中に実行される.