フロントエンドでのイベントの伝播を防ぐ方法
今回はフロントエンドでのイベントの蔓延を防ぐ方法を紹介します。フロントエンドでのイベントの蔓延を防ぐための注意点は何ですか?実際の事例を見てみましょう。
小さなデモを作成し、ボタンをクリックしてフローティング レイヤーを表示し、他の場所をクリックしてフローティング レイヤーを閉じ、簡単な 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 id="wrapper" class='wrapper'> <button id="clickMe">点我</button> <p id="popover" class="popover"> <input type="checkbox">浮层 </p> </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 サイトの他の関連記事を参照してください。

ホットAIツール

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

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

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

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

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

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

ホットトピック








![イベント ID 4660: オブジェクトが削除されました [修正]](https://img.php.cn/upload/article/000/887/227/168834320512143.png?x-oss-process=image/resize,m_fill,h_207,w_330)
一部の読者がイベント ID4660 に遭遇しました。何をすればよいかわからないことが多いため、このガイドで説明します。イベント ID 4660 は通常、オブジェクトが削除されたときにログに記録されるため、コンピューター上でイベント ID 4660 を修正する実際的な方法も検討します。イベントID4660とは何ですか?イベント ID 4660 は Active Directory 内のオブジェクトに関連しており、次のいずれかの要因によってトリガーされます。 オブジェクトの削除 – オブジェクトが Active Directory から削除されるたびに、イベント ID 4660 のセキュリティ イベントがログに記録されます。手動変更 – ユーザーまたは管理者がオブジェクトのアクセス許可を手動で変更すると、イベント ID 4660 が生成される場合があります。これは、権限設定の変更、アクセス レベルの変更、またはユーザーやグループの追加または削除を行うときに発生する可能性があります。

iOS 16 以降を実行している iPhone では、今後のカレンダー イベントをロック画面に直接表示できます。それがどのように行われるかを知るために読んでください。文字盤の複雑機構のおかげで、多くの Apple Watch ユーザーは、手首を一目見て次のカレンダーイベントを確認できることに慣れています。 iOS16 とロック画面ウィジェットの登場により、デバイスのロックを解除しなくても、同じカレンダーのイベント情報を iPhone で直接表示できるようになりました。カレンダー ロック画面ウィジェットには 2 つの種類があり、次に予定されているイベントの時間を追跡したり、イベント名とその時間を表示する大きなウィジェットを使用したりできます。ウィジェットの追加を開始するには、Face ID または Touch ID を使用して iPhone のロックを解除し、長押しします。

場合によっては、保護者による制限、時間管理、コンテンツ フィルタリング、さらにはセキュリティ上の懸念など、さまざまな理由から Microsoft Edge で特定の Web サイトをブロックしたいことがあります。共通の動機は、生産性を高め、集中力を維持することです。気を散らす Web サイトをブロックすることで、仕事や勉強に適した環境を作り出し、気を散らす可能性を最小限に抑えることができます。最後に、コンテンツ フィルタリングは、安全で敬意を持ったオンライン環境を維持するために重要です。露骨なコンテンツ、不快なコンテンツ、不快なコンテンツを含む Web サイトをブロックすることは、適切な基準と価値観を維持することが重要な教育現場や職業現場では特に重要です。この状況に共感できる方は、この記事を読んでください。 Edge でインターネットへのアクセスをブロックする方法は次のとおりです

入力ボックスに値が追加されると、oninput イベントが発生します。次のコードを実行して、JavaScript で oninput イベントを実装する方法を理解してください。例<!DOCTYPEhtml><html> <body> <p>以下のように記述します:</p> <inputtype="text"

jQuery は、DOM 操作、イベント処理、アニメーション効果などを簡素化するために使用できる人気のある JavaScript ライブラリです。 Web 開発では、選択した要素のイベント バインディングを変更する必要がある状況によく遭遇します。この記事では、jQuery を使用して選択要素変更イベントをバインドする方法を紹介し、具体的なコード例を示します。まず、ラベルを使用してオプションを含むドロップダウン メニューを作成する必要があります。

jquery で一般的に使用されるイベントは次のとおりです: 1. ウィンドウ イベント; 2. マウス イベント (マウス クリック、移動イン イベント、移動アウト イベントなどを含む、ユーザーがドキュメント上でマウスを移動またはクリックしたときに生成されるイベント)。 3. キーボード イベント。ユーザーがキーボードのキーを押すか離すたびに、キー押下イベント、キー解放イベントなどのイベントが生成されます。 4. フォーム イベント(要素がフォーカスを取得したとき、focus() など)イベントがトリガーされ、フォーカスを失うと、blur() イベントがトリガーされ、フォームが送信されると submit() イベントがトリガーされます。

クロージャでのメモリリークを防ぐにはどうすればよいでしょうか?クロージャは JavaScript の最も強力な機能の 1 つであり、関数のネストとデータのカプセル化を可能にします。ただし、クロージャでは、特に非同期やタイマーを扱う場合にメモリ リークが発生する傾向があります。この記事では、クロージャでのメモリ リークを防ぐ方法を説明し、具体的なコード例を示します。メモリ リークは通常、オブジェクトが不要になったにもかかわらず、そのオブジェクトが占有しているメモリを何らかの理由で解放できない場合に発生します。クロージャ内で、関数が外部変数を参照する場合、これらの変数は

光を使用してニューラル ネットワークをトレーニングした清華大学の研究結果が、最近 Nature 誌に掲載されました。逆伝播アルゴリズムを適用できない場合はどうすればよいですか?彼らは、物理的な光学システムでトレーニング プロセスを直接実行する完全順方向モード (FFM) トレーニング方法を提案し、従来のデジタル コンピューター シミュレーションの制限を克服しました。簡単に言うと、これまでは物理システムを詳細にモデル化し、それらのモデルをコンピューター上でシミュレートしてネットワークをトレーニングする必要がありました。 FFM 手法ではモデリング プロセスが不要になり、システムが学習と最適化に実験データを直接使用できるようになります。これは、トレーニングで各層を後ろから前にチェックする (バックプロパゲーション) 必要がなくなり、ネットワークのパラメーターを前から後ろに直接更新できることも意味します。パズルのように例えると、バックプロパゲーションです。
