性能最適化-手ぶれ防止とスロットル
3031 ワード
ドドジャンパー
+.入力ボックスを待ち受け、文字が変化したらchangeイベントを起動する
+.手ぶれを防ぎ、直接keyupイベントを使うと、頻繁にイベントが発生し、性能に影響を与えます.
+.ただし、手ぶれ防止:ユーザー入力が終了したり、一時停止したりした場合、彩画トリガイベント
debounceは一定期間にわたって連続的な関数呼び出しを行います.その関数は一回だけ実行できます.一つのタイマーを維持するには、タイマーが終わってからイベントを継続することができるという原理があります.
実装されていないコードコード(統合理解のため):
+.要素をドラッグするときは、その要素がドラッグされた位置をいつでも持っていきます.
+.直接ドラゴ事件を使うと、頻繁に触発され、使いやすくなります.
+.ただし、スロットルを使用すると、ドラッグ速度が複数のブロックであっても、100 msごとにトリガされます.
スロットル:一定期間の関数呼び出しは、イベントが必ず一回実行されることを保証します.スロットルは一定期間で関数が必ずトリガされることを保証します.
未実装コード(統合用):
ドラッグすると、最初の100 ms以内は実行されません.100 msになると、上の矢印関数体が一回実行されます.その後、関数体のtimer=nullがreturnの関数体を飛び出すので、最後に次の100 msの動作を繰り返します.
スロットルの典型的なケースはマウスが絶えずクリックしてトリガします.n秒以内に何度もクリックすると一回だけ有効になります.
+.入力ボックスを待ち受け、文字が変化したらchangeイベントを起動する
+.手ぶれを防ぎ、直接keyupイベントを使うと、頻繁にイベントが発生し、性能に影響を与えます.
+.ただし、手ぶれ防止:ユーザー入力が終了したり、一時停止したりした場合、彩画トリガイベント
debounceは一定期間にわたって連続的な関数呼び出しを行います.その関数は一回だけ実行できます.一つのタイマーを維持するには、タイマーが終わってからイベントを継続することができるという原理があります.
実装されていないコードコード(統合理解のため):
let timer = null
let oInput = document.getElementById('input')
oInput.addEventListener('keyup', function(){
if(timer){
clearTimeout(timer)
}
timer = setTimeout(function(){
console.log(oInput.value)
}, 500)
})
パッケージされたコード:// setTimeout
// , , ,
function debounce(fn, delay=500){
//
let timer = null
return function(){
if(timer){
clearTimeout(timer)
}
// , ES5 , this Window
timer = setTimeout(() => {
// fn , , event
fn.apply(this, arguments)
}, delay)
}
}
コードテスト:(一時的に(600 ms)内でdebounce関数が連続してトリガされますが、debounce関数は一回だけ実行されます.ユーザーが文字を入力していない場合、最後の文字を入力して600 msの終了を待つと、funtion(){consolion.logn(oInput.value))をトリガし、タイマーをキャンセルします.let oInput = document.getElementById('input')
// ,
oInput.addEventListener('keyup', debounce(function(){
console.log(oInput.value)
}, 600))
スロットル+.要素をドラッグするときは、その要素がドラッグされた位置をいつでも持っていきます.
+.直接ドラゴ事件を使うと、頻繁に触発され、使いやすくなります.
+.ただし、スロットルを使用すると、ドラッグ速度が複数のブロックであっても、100 msごとにトリガされます.
スロットル:一定期間の関数呼び出しは、イベントが必ず一回実行されることを保証します.スロットルは一定期間で関数が必ずトリガされることを保証します.
未実装コード(統合用):
const oDiv1 = document.getElementById('div1')
let timer = null
oDiv1.addEventListener('drag', function(e){
if(timer) {
return false//
}
// timer
timer = setTimeout(function () {
// console.log(timer)
console.log(e.offsetX, e.offsetY)
// timer null,
timer = null// null,
}, 500)// 500 , timer , ,
})
パッケージ後のコード:// , , ,
function throttle(fn, delay=100){
let timer = null
return function(){
// let _this = this
// let arg = arguments
if(timer){
return false
}
timer = setTimeout(() => {// , ES5 this window
fn.apply(this, arguments)
timer = null
}, delay)
}
}
// test
const oDiv1 = document.getElementById('div1')
oDiv1.addEventListener('drag', throttle(function (e) {
console.log(e.offsetX, e.offsetY)
},1000))
テストドラッグすると、最初の100 ms以内は実行されません.100 msになると、上の矢印関数体が一回実行されます.その後、関数体のtimer=nullがreturnの関数体を飛び出すので、最後に次の100 msの動作を繰り返します.
const oDiv1 = document.getElementById('div1')
oDiv1.addEventListener('drag', throttle(function (e) {
console.log(e.offsetX, e.offsetY)
}, 100))
手ぶれ防止の典型的なケースは入力検索です.入力が終わってからn秒以内に検索要求を行います.n秒以内にまた入力した内容は、再計算します.スロットルの典型的なケースはマウスが絶えずクリックしてトリガします.n秒以内に何度もクリックすると一回だけ有効になります.