1. 手ぶれ補正機能とは何ですか?概念: 関数のデバウンスとは、イベントがトリガーされた後、関数は n 秒以内に 1 回しか実行できないことを意味します。イベントがトリガーされてから n 秒以内に別のイベントがトリガーされた場合、関数の実行遅延時間が再計算されます。 1. なぜ手ぶれ補正機能が必要なのでしょうか?フロントエンドの開発プロセスでは、onresize、scroll、mousemove、mousehover など、頻繁に(短時間に複数回)トリガーされるイベントがいくつかあります。制限がない場合、1 秒間に数十回または数百回実行される可能性があります。これらの関数内で他の関数、特に DOM を操作する関数(DOM に対するブラウザ操作はパフォーマンスに非常に負荷がかかります)が実行されると、コンピュータ リソースが浪費されるだけでなく、プログラムの速度が低下し、ブラウザがフリーズしたりクラッシュしたりすることさえあります。 2. 手ぶれ補正機能のポイント関数のデシェイキングの重要なポイントは、実装を支援し、実行されるコードの実行を遅らせるために setTimeout が必要であることです。メソッドが複数回トリガーされた場合、前回記録された遅延実行コードは clearTimeout でクリアされ、タイミングが再び開始されます。タイミング期間中にイベントが再トリガーされない場合、遅延時間が完了した後にターゲット コードが実行されます。 3. 手ぶれ補正機能の実装//HTML部分 <div> アカウント: <input type="text" id="myinput"> </div> //JS 部分 function debounce(fun,wait=1500){//ES6 構文 wait=1500 はパラメータのデフォルト値を設定します。wait が入力されていない場合は、1500 が使用されます。 タイムアウト = null にする 関数()を返す{ if(timeout){//タイマーが存在する場合はそれをクリアします clearTimeout(timeout) } タイムアウト = setTimeout(関数(){ 楽しい() }、待って) } } 関数testUname(){ console.log("入力終了!") } document.getElementById('myinput').addEventListener('input',debounce(testUname,1000)) 上記のコードは、手ぶれ補正機能の簡単な応用例です。各入力の間隔が 1 秒以上ある限り、入力を停止するまで「Print input end!」は表示されません。これは、各入力によって前のタイマーがクリアされるためです。 これを読んで終わりだと思いますか?心配しないで、見続けましょう: //HTML部分 <div> アカウント: <input type="text" id="myinput"> </div> //JS部分 function debounce(fun,wait=1500){ タイムアウト = null にする 関数()を返す{ console.log(this) //<input id="myinput" type="text"> console.log(arguments) // 引数 { 0: input, … } if(timeout){//タイマーが存在する場合はそれをクリアします clearTimeout(timeout) } タイムアウト = setTimeout(関数(){ console.log(this) //ウィンドウ console.log(arguments) // 引数 { … } 楽しい() }、待って) } } 関数testUname(){ console.log("入力終了!") } document.getElementById('myinput').addEventListener('input',debounce(testUname,1000)) 手ぶれ補正であれ、スロットリングであれ、この指摘と議論という 2 つの問題を解決する必要があります。 特別な参照がない場合、setInterval および setTimeout のコールバック関数内の this は window を参照します。これは、JS タイマー メソッドが window の下に定義されているためです。これは明らかに私たちが望んでいることではありません。入力ボックスを監視しているので、タイマー内の this が入力を指すようにしたいのです。 それで、これが指し示すものを変更する方法はあるのでしょうか? 簡単な方法は、パラメータを使用して、タイマー外部関数の this と引数を保存することです。次に、apply を使用して、タイマーによって実行される関数 fun の方向を変更します。 //JS部分 function debounce(fun,wait=1500){ タイムアウト = null にする 関数()を返す{ _this = this とします arg = 引数 if(timeout){//タイマーが存在する場合はそれをクリアします clearTimeout(timeout) } タイムアウト = setTimeout(関数(){ console.log(_this) //<入力 id="myinput" タイプ="text"> console.log(arg) // 引数 { 0: input, … } fun.apply(_this,arg) }、待って) } } もちろん、ES6 の矢印関数の新機能も使用できます。矢印関数の this は、関数が実行される時ではなく、関数が定義されている時に常に this を指します。矢印関数では、次の文を覚えておく必要があります: 「矢印関数には this バインディングがないため、その値はスコープ チェーンを検索して決定する必要があります。矢印関数が非矢印関数に含まれている場合、 this は最も近い非矢印関数の this にバインドされ、それ以外の場合、 this は未定義になります。」 したがって、次のように書くこともできます。 //JS部分 function debounce(fun,wait=1500){ タイムアウト = null にする 関数()を返す{ if(timeout){//タイマーが存在する場合はそれをクリアします clearTimeout(timeout) } タイムアウト = setTimeout(()=>{ console.log(this) //<input id="myinput" type="text"> console.log(arguments) // 引数 { 0: input, … } fun.apply(これ、引数) }、待って) } } 4. 手ぶれ補正機能の使用シーン手ぶれ補正機能は一般的にどのような場面で使われるのでしょうか?通常、連続イベントでコールバックを 1 回だけトリガーする必要がある場合に使用されます。具体的には:
2. 機能スロットリングとはコンセプト: 関数が一定期間内に 1 回だけ実行されるように制限します。
1. 機能スロットリングのポイント主な実装のアイデアは、setTimeout タイマーを使用することです。遅延時間を設定して、初めて呼び出されたときにタイマーを作成し、最初に変数を設定し、この変数にタイマーを割り当ててから、実行する関数を記述します。この関数が 2 回目に実行されると、変数が true であるかどうかが判断され、 true の場合は戻り値が返されます。最初のタイマーが関数を実行すると、変数は false に設定されます。次に変数が判断されるときに false となり、関数が順番に実行されます。目的は、複数の関数要求の最後の呼び出しのみが一定時間内に実行されるようにすることです。 2. 機能スロットリングの実装//JS 部分 function debounce(fun,wait=1000){//タイマーソリューション let timer = null;//最初に変数を設定します return function(){ if(!timer){//タイマーが null の場合は、timer = setTimeout(function() と入力します。{//次に、この変数にタイマーを割り当てます。fun()//次に、実行する関数を記述します。timer = null//最初のタイマーは関数を実行し、最後に変数を false に設定します。ここで、timer = null には 2 つの機能があります。1. 次のエントリを開く、2. 後続のタイマーをクリアする}) } } } 関数testUname(){ console.log(Math.random()) } document.getElementById('myinput').addEventListener('input',debounce(testUname)) 同様に、スロットル機能も this と引数の問題を解決する必要があります。改善点は次のとおりです。 //矢印関数の記述 function debounce(fun,wait=1000){ タイマーを null にする 関数()を返す{ if(!タイマー){ タイマー = setTimeout(()=>{ fun.apply(これ、引数) タイマー = null }、待って) } } } //パラメータ保存メソッド function debounce(fun,wait=1000){ タイマーを null にする 関数()を返す{ _this = this とします arg = 引数 if(!タイマー){ タイマー = setTimeout(関数(){ fun.apply(_this,arg) タイマー = null }、待って) } } } 3. 機能スロットリングの使用シナリオここまでで、関数スロットリングについてより詳しく理解していただけたかと思います。では、関数スロットリングは一般的にどのような状況で使用されるのでしょうか?
要約するこれで、JS 手ぶれ補正機能の実装と使用シナリオに関するこの記事は終了です。より関連性の高い JS 手ぶれ補正機能のコンテンツについては、123WORDPRESS.COM の以前の記事を検索するか、次の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM を応援していただければ幸いです。 以下もご興味があるかもしれません:
|
<<: Nginx ドメイン名 SSL 証明書の構成 (Web サイトの http を https にアップグレード)
>>: 単一の MySQL テーブル内の行数が 500 万を超えてはいけないのはなぜですか?
目次序文1. Mixin とは何ですか? 2. Mixin はいつ使用すればよいですか? 3. Mi...
Docker Hub公式サイト1. Pythonミラーを検索するdocker 検索 python 2...
フォームは、get と post の 2 つのデータ転送方法を提供します。どちらもデータを送信する方...
Linux がすべてのコマンドをサポートしていない場合はどうすればいいですか?すべてのLinuxコマ...
dockerでイメージを削除するコマンドはdocker rmiですが、このコマンドを実行してもイメー...
まずは効果を確認実装コード <div class="box box1"&g...
ここでは、v3 のインストールと使用にのみ焦点を当てます。v2 について学びたい場合は、公式 Web...
目次序文:暗号化アルゴリズム: 1. HTTPS の概要2. NginxはHTTPSウェブサイト設定...
目次1. はじめに2. アイデアファイルをアップロードする2つの方法3. ライフサイクル4. コード...
目次1. 初期化構造2. 蛇の色のレンダリング3. ヘビの動き4. ヘビの死を判定する方法 ヘビの死...
1. yumの紹介Yum (フルネームは Yellow dogUpdater、Modified) は...
重要なデータはバックアップする必要があり、リアルタイムでバックアップする必要があります。そうしないと...
■ ウェブサイトのテーマ計画 ウェブサイトのテーマが断片化しすぎないように注意してください。一般的に...
この記事では、カードフリップ効果を実現するためのVueの具体的なコードを例として紹介します。具体的な...
この記事は「Attribution 4.0 International (CC BY 4.0)」ライ...