JavaScriptのアンチシェイクとスロットリングとは

JavaScriptのアンチシェイクとスロットリングとは

1. 関数デバウンス

1. 画像安定化とは何ですか?

機能アンチシェイク:イベントが頻繁にトリガーされる場合、対応するコールバック関数は、イベントが一定期間トリガーされなくなった後にのみ呼び出されます。設定された間隔内に次のイベントがトリガーされると、イベントのトリガーが終了するまでタイマーが再開されます。

指定された時間内にイベントがトリガーされない場合は、イベント処理関数が呼び出されます。

次の例がこれを示しています。

/* 手ぶれ防止関数を定義* func: イベントが連続的にトリガーされなくなったときに呼び出される関数を渡す* delay: 渡されたコールバック関数の実行にかかる時間を定義する* */
 関数デバウンス(func,delay) {
  let timer = null // タイマーの保存に使用 return function (...args) {
   // タイマーが存在する場合は、タイマーをクリアしてからリセットします
   if(タイマー !== null) clearTimeout(タイマー)
   timer = setTimeout(func, delay) // 遅延を超えると、ここで func が呼び出され、イベントを受け取ります。必要に応じて、func の this ポインタを変更できます。timer は外部への参照を持っているため、破棄されません。}
 }

 /*イベント処理関数*/
 関数testDeBounce(){
  console.log('何回実行しましたか?')
 }

 // debounce によって返された関数を受け取る const temp = debounce(testDeBounce(),1000)

 /*イベントをバインドし、手ぶれ補正機能をテスト*/
 window.addEventListener('スクロール',()=>{
  温度()
 }); // これはイベント ハンドラを少なくとも 1 回呼び出し、最大で次の回数以上実行されることはありません。window.addEventListener('scroll', testDeBounce); // このように記述すると、ページがスクロールするたびにイベント ハンドラが呼び出されます。

アイデアを要約すると次のようになります。

  • 1. スロットル関数を定義する
  • 2. 関数内の変数を使用してタイマーを保存する
  • 3. タイマーが既に存在する場合はタイマーをクリアしてリセットする関数を返す。
  • 4. debounceによって返される関数を受け取る変数を定義する
  • 5. イベントコールバック関数で前のステップの変数受信メソッドを直接呼び出す

2. 関数のスロットリング

関数スロットリング:継続的なイベントトリガーを前提として、イベント処理関数が一定期間内に 1 回だけ呼び出されるようにすることが関数スロットリングです。

関数スロットルの実装方法:タイマー、タイムスタンプ、タイマー + タイムスタンプ。

2.1 タイマーの実装

アイデア:

  • 1. スロットルthrottleを定義する
  • 2. タイマーを保存するためのtimerを定義する
  • 3. 関数を返します。関数の内部定義: タイマーが存在しない場合はタイマーを設定し、一定時間後にタイマーをnullに設定します。これより前にイベントが再度トリガーされた場合、タイマー内のコールバックは無効になります。

<button>這是一個孤獨的按鈕</button>

/*
 * タイマースロットル関数を定義します * func: 着信イベント処理関数 * delay: タイマーコールバックは、delay で指定された時間内に無効になります * */
 関数スロットル(func,delay) {
  タイマーを null にする
  const コンテキスト = this
  関数(...引数)を返す{
   // タイマーが存在しない場合は if(!timer){
    タイマー = setTimeout(()=>{
     func.apply(context,args) // 返された関数呼び出しの環境を考慮するため、ここでは直接使用されません
     timer = null // delay 後にタイマーをクリアします},delay)
   }
  }
 }

 関数テスト() {
  console.log('ああああ!')
 }

 定数 temp = スロットル(テスト,1000)

 document.querySelector('button').addEventListener('click',()=>{
  温度()
 })

2.2 タイムスタンプの実装

var スロットル = 関数(func, 遅延) {            
  var prev = Date.now();            
  関数()を返す{                
    var コンテキスト = this;                
    var args = 引数;                
    var now = Date.now();                
    if (現在 - 前回 >= 遅延) {                    
      func.apply(コンテキスト、引数);                    
      prev = Date.now();                
    }            
  }        
}    

関数ハンドル() {            
  コンソールにログ出力します。        
}        

window.addEventListener('スクロール'、スロットル(ハンドル、1000));

2.3 タイムスタンプ + タイマー

// スロットル コード (タイムスタンプ + タイマー):
var スロットル = 関数(func, 遅延) {     
    var タイマー = null;     
    var startTime = Date.now();     
    関数()を返す{             
        var curTime = Date.now();             
        var 残り時間 = 遅延 - (現在時刻 - 開始時刻);             
        var コンテキスト = this;             
        var args = 引数;             
        タイマーをクリアします。              
        残り <= 0 の場合                    
            func.apply(コンテキスト、引数);                    
            開始時刻 = Date.now();              
        } それ以外 {                    
            タイマー = setTimeout(func, 残り時間);              
        }      
    }
}

関数ハンドル() {      
    コンソールにログ出力します。
} 

window.addEventListener('スクロール'、スロットル(ハンドル、1000));

JavaScript の手ぶれ補正とスロットリングについての記事はこれで終わりです。JavaScript の手ぶれ補正とスロットリングについての詳細は、123WORDPRESS.COM の過去の記事を検索するか、以下の関連記事を引き続きご覧ください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • JavaScript 関数のスロットリングとデバウンス
  • JavaScript デバウンス関数の詳細な説明
  • Javascript スロットル関数とデバウンス関数
  • JavaScript のアンチシェイクとスロットリングの違いと実装
  • jsのアンチシェイクスロットリングについて詳しく説明します
  • JavaScript デバウンスとスロットリング

<<:  MySQL データベース JDBC プログラミング (Java は MySQL に接続します)

>>:  小さなアイコンのフロントエンド処理ソリューションのグラフィカルな説明

推薦する

自動ロック画面機能を実現するjs

1. 使用シナリオこのような要件があるため、システムが開発されました。ユーザーがデスクトップを離れ...

Mysql5.7 以降での ONLY_FULL_GROUP_BY エラーの解決方法

最近、開発プロセス中に、プロジェクト開発環境に接続されている MySQL データベースは Aliba...

ブロックレベル要素、インライン要素、可変要素の概要

ブロック要素p - 段落テキストの事前フォーマットテーブルol - ソートフォームul - 順序なし...

HTML で入力テキスト入力キャッシュのクリアを禁止する 2 つの方法

ほとんどのブラウザはデフォルトで入力値をキャッシュし、ctl+F5 を使用して強制的に更新することに...

入力のid属性とname属性の違いの例

長い間ウェブサイトを作ってきましたが、入力時のnameとidの違いがまだわかりません。最近jQuer...

Dockerデータを完全にクリーンアップする方法

目次定期的に剪定するミラーエビクションコンテナのクリーンアップネットワークソート体積の蒸発完全にクリ...

MySQL に接続する際に Navicat for MySQL が 2005 エラーを報告する問題を解決する

前回の記事では、Navicat for Mysql 接続エラー 1251 (接続失敗) の問題を解決...

MySQLデータベースのデータテーブルに関する詳細な基本操作

目次1. 現在のデータベース内のテーブルを表示する2. テーブルを作成する3. 指定されたテーブル構...

MySQL 8.0.19 winx64 インストールチュートリアルと Windows 10 での初期パスワードの変更

この記事では、参考までにMySQL 8.0.19 winx64のインストールチュートリアルを紹介しま...

地域のカスタムカラーのためのechars 3Dマップソリューション

目次質問伸ばす問題を解決する要約する質問プロジェクトの要件に従って、以下の州地図で個々の都市を(異な...

ウェブページ HTML 特殊記号 HTML 特殊文字比較表

特殊記号名前付きエンティティ10進数エンコード特殊記号名前付きエンティティ10進数エンコードアルファ...

MySQL シリーズ 13 MySQL レプリケーション

目次1. MySQLレプリケーション関連の概念2. シンプルな1マスター1スレーブアーキテクチャの実...

CSSカスケーディングメカニズムについての簡単な説明

CSS にカスケード メカニズムがあるのはなぜですか? CSS では、同じ要素の特定のプロパティに同...

Vue グローバルメソッドを設定する 2 つの方法

目次1. はじめに2. 最初の方法3. 2番目の方法要約する1. はじめにVue プロジェクトの開発...

SSH ポート転送、ローカル ポート転送、リモート ポート転送、動的ポート転送の詳細

パート 1 SSH ポート転送の概要カフェで無料Wi-Fiを利用しているとき、誰かがあなたのパスワー...