JavaScript イベントのバブリングとキャプチャとブロックの方法の詳細な説明_JavaScript スキル
1. 一連のイベント
この問題の原因は非常に単純です。別の要素内にネストされた要素があるとします。
---------------------------------
| 要素 1 | ------- |
--------------------- ---- -------
: どちらも onClick イベント ハンドラーを持っています。ユーザーが要素 2 をクリックすると、要素 1 と要素 2 の両方のクリック イベントがトリガーされます。しかし、どのイベントが最初にトリガーされるのでしょうか?どのイベント ハンドラー関数が最初に実行されますか?言い換えれば、一連の出来事の正確な順序は何だったのでしょうか?
2. 2 つのモデル
予想通り、Netscape と Microsoft は、「ブラウザ戦争」の時代に対処するために 2 つの非常に異なるアプローチをとっていました。
Netscape は、要素 1 のイベントが最初に発生することを推奨しています。Microsoft は、このイベントの順序がバブリング タイプと呼ばれていると主張しています。そのうちの出来事の順序は正反対です。 Explorer ブラウザはバブリング イベントのみをサポートしますが、Mozilla、Opera7、Konqueror は両方をサポートします。古い Opera と iCab はどちらもサポートしていません
3. イベントをキャプチャします
イベントのキャプチャを使用する場合
コードをコピーします
| -- ---------- |
| イベントのキャプチャ |
-------------------------- -- ------
: 要素 1 のイベント ハンドラーが最初にトリガーされ、要素 2 のイベント ハンドラーが最後にトリガーされます
4. バブルイベント
バブリングイベントを使用する場合
コードをコピーします
| イベントバブリング |
-------------------------- -- -------
: 要素 2 の処理関数が最初にトリガーされ、続いて要素 1
がトリガーされます。
5. W3C モデル
W3c は、この戦いで正しい解決策を賢明に選択しました。 w3c イベント モデルで発生するイベントは、まずターゲット要素に到達するまでキャプチャ フェーズに入り、その後バブリング フェーズに入ります
コピー コード
--
| | |
| -|
| |
|
| W3C イベント モデル |
-------------------------------------- ------
element2.addEventListener('click',doSomething,false)
(このイベントはここでの観光客のようなもので、外側から内側へ移動し、トリガーされた主要な要素に徐々に近づき、その後反対方向に去っていきます)
1. クリック イベントは最初にキャプチャ フェーズに入ります (要素 2 の方向に徐々に近づきます)。キャプチャフェーズで要素 2 の祖先要素のいずれかに onclick ハンドラーがあるかどうかを確認します
2. 要素 1 に onclick ハンドラーがあることが判明したため、doSomething2 が実行されます
3. イベントはターゲット自体をチェックします (要素 2) ) ですが、キャプチャフェーズには onclick ハンドラーがありません。さらに処理関数が見つかりました。イベントはバブリング段階に入り始め、要素 2 のバブリング段階にバインドされている関数である doSomething() が自然に実行されます。
4. イベントは要素 2 から離れて、バブリングフェーズ中に祖先要素にハンドラーがバインドされているかどうかを確認します。そのようなケースは存在しないため、何も起こりません
逆のケースは次のとおりです。
element2.addEventListener('click',doSomething,false)
1. イベントをクリックしてキャプチャフェーズに入ります。キャプチャフェーズで要素 2 の祖先要素のいずれかに onclick ハンドラーがあるかどうかを確認しますが、何も見つかりません
2. イベントはターゲット自体を検出します。イベントはバブリングフェーズに入り始め、要素 2 のバブリングフェーズにバインドされた関数が実行されます。 doSomething()
3. イベントがターゲットから離れ始めます。バブリング段階で要素 2 の祖先要素にハンドラー関数がバインドされているかどうかを確認します。要素 1 の
が実行されます。
w3c dom (Document Object Model) をサポートするブラウザーでは、従来のイベント バインディング メソッドは次のとおりです。
7. バブリングイベントを使用する
バブリング イベントやイベントのキャプチャを意識的に使用する開発者はほとんどいません。彼らが現在作成している Web ページでは、イベントはバブルアップするため、複数の関数によって処理される必要はありません。しかし、マウスを 1 回クリックしただけでさまざまなことが起こる (バブリングにより複数の機能が実行される) ため、ユーザーが混乱することがあります。ほとんどの場合、処理関数は互いに独立している必要があります。ユーザーが要素をクリックしたときに何が起こるか、そしてユーザーが別の要素をクリックしたときに何が起こるかは、互いに独立しており、バブリングによってリンクされることはありません。
8. それはいつも起こります最初に理解する必要があるのは、イベントのキャプチャまたはバブリングが常に発生しているということです。ページドキュメント全体に対して一般的な onclick 処理関数を定義する場合
ページ上の任意の要素をクリックするクリック イベントは、最終的にページの最上位のドキュメント レイヤーまでバブルアップし、前の処理関数がバブリングが終了しないことを明示的に指定しない限り、一般的な処理関数をトリガーします。ドキュメントレベル全体に伝播されます
上記のコードの 2 番目の文に追加:
>>> まず IE について話しましょう
object.setCapture() オブジェクトが setCapture されると、そのメソッドはキャプチャのためにドキュメント全体に継承されます。
ドキュメント全体をキャプチャするためにメソッドを継承する必要がない場合は、object.releaseCapture() を使用します
>>>その他
Mozilla にも同様の機能がありますが、メソッドは少し異なります
window.captureEvents (Event.eventType)
window.releaseEvents(Event.eventType)
>>>例
//次の文を追加すると、メソッドはドキュメント (またはウィンドウ、ブラウザによって異なります) に継承され、
obj.captureEvents(Event.click); //FF
obj.setCapture() // IE
9. 使用方法
イベントの伝播はページドキュメント (このトップレベル) で終了するため、次のようなページがあると仮定すると、デフォルトのイベントハンドラーが可能になります。
-------------------------- ---- --------
| 要素 1 |
| ----- |
----- --------------------------------- -
element1.onclick = doSomething;
element2.onclick = doSomething;
document.onclick =defaultFunction;
ユーザーが要素 1 または要素 2 をクリックすると、doSomething() が実行されます。イベントがdefaultFunction()にバブルアップしたくない場合は、必要に応じて、ここでイベントがバブルアップするのを防ぐことができます。ただし、ユーザーがページ上の別の場所をクリックした場合でも、defaultFunction() は実行されます。この効果は場合によっては役に立つかもしれません。
設定ページ - 処理機能でより大きなトリガー領域を設定できるようにします。これは「ドラッグ エフェクト」スクリプトで必要です。一般に、要素レイヤーでの Mousedown イベントの発生は、その要素が選択され、mousemove イベントに応答できるようになることを意味します。通常、マウスダウンはブラウザのバグを避けるためにこの要素レイヤーにバインドされますが、他の 2 つのイベント関数のスコープはページ全体 (?) でなければなりません
ブラウザ学の第一法則を思い出してください。何が起こってもおかしくありません。それが少なくともある程度の準備ができているときです。そこで何が起こるかというと、ユーザーがドラッグ&ドラッグするときにページ上でマウスを大きく動かしますが、スクリプトがその大きな振幅に応答できず、マウスが要素レイヤーに留まらなくなるということです
1. onmouseover ハンドラー関数が要素レイヤーにバインドされている場合、この要素レイヤーはマウスの動きに反応しなくなるため、ユーザーは違和感を感じます。
2. onmouseup ハンドラー関数が要素レイヤーにバインドされている場合の場合、イベントはトリガーされません。その結果、ユーザーがこの要素レイヤーをドロップしようとしても、要素レイヤーはマウスの動きに応答し続けます。これはさらなる混乱を引き起こすでしょう (?)
この例では、ハンドラー関数をページ レベルに配置することで常に確実に実行できるため、イベント バブリングは非常に便利です。
ただし、一般的には、各機能が相互に干渉しないように、すべてのバブリングとキャプチャをオフにする必要があります。さらに、ドキュメント構造が非常に複雑である場合 (多数のテーブルが相互にネストされているなど)、システム リソースを節約するためにバブリングをオフにすることもできます。この時点で、ブラウザはターゲット要素のすべての祖先をチェックして、ハンドラー関数があるかどうかを確認する必要があります。たとえ誰も見つからなかったとしても、先ほどの捜索にはまだ時間がかかります
Microsoft モデルでは、イベントの cancelBubble プロパティを true に設定する必要があります
w3c モデルでは、イベントの stopPropagation() メソッドを呼び出す必要があります
これにより、すべてのバブリングが外側に伝播するのを防ぎます。クロスブラウザーの解決策として、これを実行する必要があります:
関数 doSomething(e)
{
if (!e) var e = window.event;
e.cancelBubble = true;
if (e.stopPropagation) e.stopPropagation();
}
cancelBubble 属性をサポートするブラウザで cancelBubble を設定しても問題はありません。ブラウザは肩をすくめてこの属性を作成します。もちろん、これで実際にバブリングがキャンセルされるわけではありませんが、少なくともこのコマンドが安全で正しいものであることが保証されます
11. 現在のターゲット
前に見たように、イベントは target または srcElement 属性を使用して、イベントが発生したターゲット要素 (つまり、ユーザーが最初にクリックした要素) を示します。この場合、クリックしたのは要素 2 です。
キャプチャまたはバブリングフェーズ中のターゲット要素は変化せず、常に要素 2 に関連付けられていることを理解することが非常に重要です。
しかし、次の関数をバインドするとします。
element2.onclick = doSomething;
ユーザーが要素 2 をクリックすると、doSomething() が 2 回実行されます。しかし、どの HTML 要素がこのイベントに応答しているかをどうやって知るのでしょうか? target/srcElement も手がかりを与えませんが、イベントの原因である (ユーザーがクリックしたものであるため) 人々は常に要素 2 を好むでしょう。
この問題を解決するために、w3c は、イベントを処理している要素を指す currentTarget 属性を追加しました。これはまさに必要なものです。残念ながら、Microsoft モデルには同様の属性はありません
「this」キーワードを使用することもできます。上記の例では、currentTarget など、イベントを処理する HTML 要素に相当します。
12. Microsoft モデルの問題
しかし、Microsoft イベント バインディング モデルを使用する場合、this キーワードは HTML 要素と同等ではありません。 Lenovo には、currentTarget プロパティ (?) に似た Microsoft モデルがありません。上記のコードに従うと、次のことを意味します:
element2.attachEvent('onclick',doSomething)
どの HTML 要素がイベントの処理を担当しているのかを正確に知ることができません。これが Microsoft のイベント バインディング モデルの最も深刻な問題です。これは、Windows で IE 専用のアプリケーションを開発する場合でも、私が決して使用しない理由でもあります
currentTarget のようなプロパティをすぐに追加できるようにしたいと思っています。それとも標準に従うのでしょうか? Web 開発者にはこの情報が必要です
追記:
私は実際に JavaScript を使用したことがないため、この記事にはよく理解できない部分がいくつかあります。そのため、ドラッグ効果に関するセクションなど、追加または追加があれば、唐突に翻訳することしかできません。ご質問がありましたら、メッセージを残していただけますようお願いいたします。

ホット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)

ホットトピック









イベントバブリングについて: 子要素をクリックすると親要素のイベントがトリガーされるのはなぜですか?イベントバブリングとは、入れ子になった要素構造において、子要素がイベントをトリガーすると、そのイベントがバブリングのように層ごとに親要素の層に最外層の親要素まで渡されることを意味します。このメカニズムにより、子要素のイベントが要素ツリー全体に伝播され、関連するすべての要素が順番にトリガーされます。イベントバブリングをより深く理解するために、具体的なコード例を見てみましょう。 HTML コード: <divid="parent&q"

タイトル: jQuery.val() が失敗する理由と解決策 フロントエンド開発では DOM 要素の操作に jQuery がよく使われますが、フォーム要素の値の取得や設定には .val() メソッドが広く使われています。ただし、.val() メソッドが失敗し、フォーム要素の値を正しく取得または設定できない状況が発生することがあります。この記事では、.val() エラーの原因を調査し、対応する解決策を提供し、具体的なコード例を添付します。 1.原因分析.val()メソッド

イベントのバブリングが 2 回トリガーされるのはなぜですか?イベント バブリング (イベント バブリング) とは、DOM において、要素がイベント (クリック イベントなど) をトリガーすると、イベントがその要素から親要素にバブルアップし、最後に最上位のドキュメント オブジェクトにバブルアップすることを意味します。イベント バブリングは DOM イベント モデルの一部であり、これにより開発者はイベント リスナーを親要素にバインドできるため、子要素がイベントをトリガーすると、バブリング メカニズムを通じてイベントをキャプチャして処理できます。ただし、開発者は、バブルして 2 回トリガーされるイベントに遭遇することがあります。

JavaScript のクリック イベントは、イベント バブリング メカニズムのため、繰り返し実行できません。この問題を解決するには、次の措置を講じることができます。 イベント キャプチャを使用する: イベントがバブルアップする前に起動するイベント リスナーを指定します。イベントの引き継ぎ: イベントのバブリングを停止するには、event.stopPropagation() を使用します。タイマーを使用します。しばらくしてからイベント リスナーを再度トリガーします。

Vue.js イベント修飾子は、次のような特定の動作を追加するために使用されます。 デフォルト動作の防止 (.prevent) イベント バブリングの停止 (.stop) ワンタイム イベント (.once) イベントのキャプチャ (.capture) パッシブ イベント リスニング (.passive) アダプティブ修飾子 (.self)キー修飾子 (.key)

イベントのバブリングが 2 回連続して発生するのはなぜですか?イベント バブリングは Web 開発における重要な概念であり、ネストされた HTML 要素でイベントがトリガーされると、イベントが最も内側の要素から最も外側の要素までバブルアップすることを意味します。このプロセスは時々混乱を引き起こす可能性があり、よくある問題の 1 つは、イベントのバブリングが 2 回続けて発生することです。イベント バブリングが 2 回連続して発生する理由をよりよく理解するために、まずコード例を見てみましょう。

JS イベントでバブルが発生しない状況にはどのようなものがありますか?イベントバブリング(Event Bubble)とは、要素上でイベントが発生した後、最も内側の要素から最外側の要素に向かってDOMツリーに沿って上方向にイベントが送信されることを意味し、この送信方法をイベントバブリングと呼びます。ただし、すべてのイベントがバブル化できるわけではなく、イベントがバブル化しない特殊なケースもいくつかあります。この記事では、JavaScript でイベントがバブルアップしない状況を紹介します。 1. stopPropagati を使用する

バブリングイベントを防ぐために一般的に使用されるコマンドは何ですか? Web 開発では、イベントのバブリングを処理する必要がある状況によく遭遇します。クリック イベントなどのイベントが要素でトリガーされると、その親要素も同じイベントをトリガーします。イベント配信のこの動作は、イベント バブリングと呼ばれます。場合によっては、イベントがバブルアップするのを防ぎ、イベントが現在の要素でのみ発生し、上位の要素に渡されないようにしたい場合があります。これを実現するには、バブリング イベントを防ぐいくつかの一般的なディレクティブを使用できます。イベント.ストッププロパ
