今回はフロントエンドでのイベントの蔓延を防ぐ方法を紹介します。フロントエンドでのイベントの蔓延を防ぐための注意点は何ですか?実際の事例を見てみましょう。
小さなデモを作成し、ボタンをクリックしてフローティング レイヤーを表示し、他の場所をクリックしてフローティング レイヤーを閉じ、簡単な CSS を作成します
<style> .wrapper{ position:relative; display:inline-block; } .popover{ position:absolute; border:1px solid red; left:100%; top:0; padding:10px; margin-left:10px; background:white; display: none; /*默认隐藏*/ } .popover::before{ position:absolute; content:''; top:5px; right:100%; border:10px solid transparent; border-right-color:red; } .popover::after{ position:absolute; content:''; top:5px; right:100%; border:10px solid transparent; border-right-color:white; margin-right:-1px; } </style> <p> <button>点我</button> </p><p> <input>浮层 </p> <script> clickMe.addEventListener('click',function(){ popover.style.display = 'block'; }); </script>
さて、ページ上の空白部分をクリックして閉じたらどうなるでしょうか?どのような方法を使用すればよいでしょうか? 以下のようなコード
document.addEventListener('click',function(){ popover.stely.display = 'none'; });
のような監視ドキュメントが思いつきやすいのですが、実際にこうして書いてみるとボタンが無効となり、どれをクリックしても反応しません。どうしてこれなの?
前回の記事で述べた攻略とバブリングイベントを理解すると、簡単に理解できるようになります。
モニタリングがキャプチャ フェーズであるかバブリング フェーズであるかは指定しませんでした。ボタンをクリックすると、キャプチャ フェーズは発生しません。まず、ボタンは異なります。 code> の関数が最初にトリガーされ、次に <code>document
の関数もトリガーされ、フローティング レイヤーが再び非表示になっているように見えます。 button
上函数先触发,然后document
上函数也触发了,导致准备出现的浮层又被隐藏了。
那你可能要问,button
上的事件执行了没?其实这两个事件都执行了,只是时间太短,浏览器默认一起执行了,可以在里面加一个debugger
,就可以看到了。
clickMe.addEventListener('click',function(){ popover.style.display = 'block'; });
那该怎么解决呢?最简单的方法是,除了要执行popover.style.display = 'block'
,还要阻止事件传播
clickMe.addEventlistener('click',function(){ popover.style.display = 'block'; }); popover.addEventListener('click',function(e){ e.stopPropagation(); });
这里为什么添加在按钮的父元素上面呢?如果不添加在父元素上面,点击浮层的时候,浮层也会被关闭。
如果页面上有很多监听器的话,这个方法是比较浪费内存的,比较省内存的方法用JQuery 做
$(clickMe).on('click',function(){ $(popover).show(); $(document).one('click',function(){ $(popover).hide(); }); }); $(wrapper).on('click',function(e){ e.stopPropagation(); })
一开始不监听,只在popover
`show`的时候监听一次,马上关掉,这叫做清理战场。$(wrapper).on('click',false)
和下面的代码完全等价
$(wrapper).on('click',function(e){ e.preventDefault(); //阻止默认事件 e.stopPropagation(); //阻止传播 })
但是如果页面中有checkbox
,你在它的父元素任何一层,包括checkbox
自己,添加了组织默认事件那么这个checkbox
就没办法被check
。
这里有个问题,如果没有阻止事件传播,向下面这样,会发生什么事情呢?
$(clickMe).on('click',function(){ $(popover).show(); $(document).one('click',funtion(){ $(popover).hide(); }); });
当然了,和之前一样,什么事情也不会发生,那当我点击按钮之后里面都发生了那些事情呢?
当我点击了按钮之后,它会做两件事情,首先把popover
`show出来,然后把
hide函数添加到
document上面,当事件传播到
document`,就会又把它给隐藏了。
可以给它添加一个setTimeout()
函数来解决这个问题
$(clickMe).on('click',function(){ $(popover).show(); setTimeout(function(){ $(document).one('click',function(){ $(popover).hide(); }) },0) });
setTimeout(fn,0)
这个0
不是马上执行,而是尽快执行,具体是在冒泡结束在执行这里的函数,也就是说,当冒泡结束后,在把监听事件添加到document
上面,等待用户下次点击在执行。
总结:
同时监听
button
和document
,点啥都没反应,因为两个函数都执行了,用阻止事件传播解决了,比较浪费内存-
好一定的方法是用jQuery 做,点击
rrreeebutton
后在监听document
,关闭了就不再监听,不阻止事件传播,点啥也没反应,两种解决方法:一种是阻止事件传播,另一种是添加一个setTimeout()
それでは、button
のイベントが実行されたかどうかを尋ねる場合があります。実際、両方のイベントが実行されますが、時間が短すぎます。ブラウザはデフォルトでそれらを一緒に実行します。内部にdebugger
を追加すると、それを確認できます。 それではどうやって解決すればいいのでしょうか?最も簡単な方法は、
popover.style.display = 'block'
の実行に加えて、イベントの伝播も防ぐことですここでボタンの親要素にイベントが追加されるのはなぜですか?親要素に追加されていない場合は、クリックするとフローティングレイヤーが閉じられます。
ページ上に多くのリスナーがある場合、この方法はメモリをより無駄に消費します。よりメモリを節約する方法は、JQuery を使用することです
rrreee最初はリッスンせず、popover
`show のときのみです。 ` 一度監視してすぐに停止することを、戦場のクリーンアップと呼びます。 $(wrapper).on('click',false)
は次のコード rrreee
と完全に同等ですが、ページに checkbox
がある場合は、 checkbox
自体を含む要素のいずれかのレイヤーが組織のデフォルト イベントを追加する場合、この checkbox
を check
にすることはできません。
ここで質問がありますが、イベントの蔓延を防げなかった場合、次のようになりますか? rrreee もちろん、以前と同様に何も起こりません。ボタンをクリックすると何が起こったでしょうか?
ボタンをクリックすると、2 つの処理が実行されます。まず、popover
`show が表示され、次に
hide 関数が
に追加されます。 >document 上記では、イベントが
document` に伝播すると、再び非表示になります。
この問題を解決するには、setTimeout()
関数を追加できますrrreeesetTimeout(fn,0)
この 0
はそうではありませんすぐに実行されますが、できるだけ早く実行します。具体的には、この関数はバブリングが終了した後に実行されます。つまり、バブリングが終了したら、listen イベントを document
に追加して待機します。ユーザーが次回実装するときにクリックします。
-
button
とdocument
を同時に監視します。クリックしても何も起こりません両方の関数が実行され、メモリの無駄であるイベントの伝播を防ぐことで問題が解決されます🎜🎜 - 🎜 最良の方法は、jQuery を使用し、
button
をクリックして、document
をリッスンします。オフにするとリッスンしなくなります。イベントの伝播は妨げられず、クリックしても何も起こりません。解決策は 2 つあります。1 つは次の方法です。イベントの伝播を防ぐこと、もう 1 つはsetTimeout()
関数を追加することです。 🎜🎜🎜🎜この記事の事例を読んだ後は、この方法を習得したと思います。さらに興味深い情報については、php 中国語 Web サイトの他の関連記事に注目してください。 🎜🎜推奨読書: 🎜🎜🎜 React-router v4 を使用する手順の詳細な説明🎜🎜🎜🎜🎜Chart.js 軽量チャート ライブラリのユースケース分析🎜🎜🎜🎜🎜Chart.js 軽量の使用手順の詳細な説明HTML5 チャート描画ツール ライブラリ 🎜🎜🎜🎜🎜
以上がフロントエンドでのイベントの伝播を防ぐ方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

PythonとJavaScriptのパフォーマンスと効率の違いは、主に以下に反映されています。1)解釈された言語として、Pythonはゆっくりと実行されますが、開発効率が高く、迅速なプロトタイプ開発に適しています。 2)JavaScriptはブラウザ内の単一のスレッドに限定されていますが、マルチスレッドおよび非同期I/Oを使用してnode.jsのパフォーマンスを改善でき、両方とも実際のプロジェクトで利点があります。

JavaScriptは1995年に発信され、Brandon Ikeによって作成され、言語をCに実現しました。 2。JavaScriptのメモリ管理とパフォーマンスの最適化は、C言語に依存しています。 3. C言語のクロスプラットフォーム機能は、さまざまなオペレーティングシステムでJavaScriptを効率的に実行するのに役立ちます。

JavaScriptはブラウザとnode.js環境で実行され、JavaScriptエンジンに依存してコードを解析および実行します。 1)解析段階で抽象的構文ツリー(AST)を生成します。 2)ASTをコンパイル段階のバイトコードまたはマシンコードに変換します。 3)実行段階でコンパイルされたコードを実行します。

PythonとJavaScriptの将来の傾向には、1。Pythonが科学コンピューティングの分野での位置を統合し、AI、2。JavaScriptはWebテクノロジーの開発を促進します。どちらもそれぞれのフィールドでアプリケーションシナリオを拡大し続け、パフォーマンスをより多くのブレークスルーを行います。

開発環境におけるPythonとJavaScriptの両方の選択が重要です。 1)Pythonの開発環境には、Pycharm、Jupyternotebook、Anacondaが含まれます。これらは、データサイエンスと迅速なプロトタイピングに適しています。 2)JavaScriptの開発環境には、フロントエンドおよびバックエンド開発に適したnode.js、vscode、およびwebpackが含まれます。プロジェクトのニーズに応じて適切なツールを選択すると、開発効率とプロジェクトの成功率が向上する可能性があります。

はい、JavaScriptのエンジンコアはCで記述されています。1)C言語は、JavaScriptエンジンの開発に適した効率的なパフォーマンスと基礎となる制御を提供します。 2)V8エンジンを例にとると、そのコアはCで記述され、Cの効率とオブジェクト指向の特性を組み合わせて書かれています。3)JavaScriptエンジンの作業原理には、解析、コンパイル、実行が含まれ、C言語はこれらのプロセスで重要な役割を果たします。

JavaScriptは、Webページのインタラクティブ性とダイナミズムを向上させるため、現代のWebサイトの中心にあります。 1)ページを更新せずにコンテンツを変更できます。2)Domapiを介してWebページを操作する、3)アニメーションやドラッグアンドドロップなどの複雑なインタラクティブ効果、4)ユーザーエクスペリエンスを改善するためのパフォーマンスとベストプラクティスを最適化します。

CおよびJavaScriptは、WebAssemblyを介して相互運用性を実現します。 1)CコードはWebAssemblyモジュールにコンパイルされ、JavaScript環境に導入され、コンピューティングパワーが強化されます。 2)ゲーム開発では、Cは物理エンジンとグラフィックスレンダリングを処理し、JavaScriptはゲームロジックとユーザーインターフェイスを担当します。


ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

AtomエディタMac版ダウンロード
最も人気のあるオープンソースエディター

EditPlus 中国語クラック版
サイズが小さく、構文の強調表示、コード プロンプト機能はサポートされていません

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

Safe Exam Browser
Safe Exam Browser は、オンライン試験を安全に受験するための安全なブラウザ環境です。このソフトウェアは、あらゆるコンピュータを安全なワークステーションに変えます。あらゆるユーティリティへのアクセスを制御し、学生が無許可のリソースを使用するのを防ぎます。

SAP NetWeaver Server Adapter for Eclipse
Eclipse を SAP NetWeaver アプリケーション サーバーと統合します。

ホットトピック









