Javascript イベントキャプチャとバブリングメソッドの詳細な説明

Javascript イベントキャプチャとバブリングメソッドの詳細な説明

1. イベント処理モデル

イベント バブリングとイベント キャプチャリング: イベント バブリングとイベント キャプチャリングは、それぞれ Microsoft と Netscape によって提案されました。どちらの概念も、ページ内のイベント フロー (イベントが発生する順序) の問題を解決することを目的としています。

<div id="d1">
        <div id="d2">
            <div id="d3"></div>
        </div>
</div>

3 つのネストされた div がある場合、3 つの要素に同じイベントが登録されると、それらのトリガー順序はどのようになりますか?

1. イベントバブリング

Microsoft は、イベント バブリングと呼ばれるイベント ストリームを提案しました。構造的に(視覚的にではなく)ネストされた要素にはバブリング機能があり、つまり同じイベントが子要素から親要素にバブリングします。 (ボトムアップ)

上記の例では、バブリング方式を使用する場合、トリガー順序は d3——>d2——>d1 となるはずなので、確認してみましょう。

(1)3つのdiv要素にイベントをバインドする

//1. 要素を取得する var d1 = document.querySelector('#d1')
var d2 = document.querySelector('#d2')
var d3 = document.querySelector('#d3')
//2. イベントのバインド d1.onclick = function(){
     コンソールログ(このID)
  }
d2.onclick = 関数(){
      コンソールログ(このID)
  }
d3.onclick = 関数(){
      コンソールログ(このID)
   }

(2)運用実績:

赤い部分をクリックしてください:

紫色の領域をクリックします。

緑色の領域をクリックします:

以上、イベント盛り上がってます!

2. イベントキャプチャ

構造的に(視覚的にではなく)ネストされた要素には、イベント キャプチャの機能があります。つまり、親要素から子要素(イベント ソース要素)に同じイベントがキャプチャされます。 (トップダウン) (つまり、イベントはキャプチャされません)

上記の例では、バブリング方式を使用する場合、トリガー順序は d1——>d2——>d3 となるはずなので、確認してみましょう。

(1)3つのdiv要素にイベントをバインドする

//1. 要素を取得する var d1 = document.querySelector('#d1')
var d2 = document.querySelector('#d2')
var d3 = document.querySelector('#d3')
//2. イベントのバインド d1.onclick = function(){
     コンソールログ(このID)
  }
d2.onclick = 関数(){
      コンソールログ(このID)
  }
d3.onclick = 関数(){
      コンソールログ(このID)
   }

(2)運用実績:

赤い部分をクリックしてください:

紫色の領域をクリックします。

緑色の領域をクリックします:

イベント攻略ゲット!!!

知らせ:

  • トリガーの順序: 最初にキャプチャ、次にバブリング
  • focusblurchangesubmitresetselectなどのイベントはバブルしません。

2. イベントのバブルを防ぐ

(1) W3C標準のevent.stopPropagation(); ですが、IE9以下ではサポートされていません。

//1. 要素を取得する var d1 = document.querySelector('#d1')
var d2 = document.querySelector('#d2')
var d3 = document.querySelector('#d3')
//2. イベントのバインド d1.onclick = function(){
     コンソールログ(このID)
  }
d2.onclick = 関数(){
      コンソールログ(このID)
  }
d3.onclick = 関数(e){
      e.stopPropagation();
      コンソールログ(このID)
   }

緑色の領域をクリックすると、外部イベントが順番にトリガーされず、イベントのバブリングがブロックされることがわかります。

(2) IE固有: event.cancelBubble = true;

//1. 要素を取得する var d1 = document.querySelector('#d1')
var d2 = document.querySelector('#d2')
var d3 = document.querySelector('#d3')
//2. イベントのバインド d1.onclick = function(){
     コンソールログ(このID)
  }
d2.onclick = 関数(){
      コンソールログ(このID)
  }
d3.onclick = 関数(e){
      e.cancelBubble = true;
      コンソールログ(このID)
   }

結果は(1)と同じである。

(3)マージキャンセル:falseを返す

JavaScript では、 return falseとデフォルトの動作のみが防止されますが、jQuery ではデフォルトの動作とオブジェクトのバブルの両方が防止されます。

要約する

この記事はこれで終わりです。皆さんのお役に立てれば幸いです。また、123WORDPRESS.COM のその他のコンテンツにも注目していただければ幸いです。

以下もご興味があるかもしれません:
  • 最もよく使用されるJavaScriptイベントについて詳しく学ぶ
  • JavaScriptのイベントループの仕組みの分析
  • JavaScript イベント キャプチャ バブリングとキャプチャの詳細
  • jsイベント委譲の詳細な説明
  • js におけるイベントバブリングとイベントキャプチャの簡単な分析
  • JavaScript イベント ループのケース スタディ

<<:  CSSレイアウトにおけるフローティング問題に対する4つの解決策の詳細な説明

>>:  バックアップと削除のためにリアルタイムでステートメントを検出するMySQLトリガーの考え方の詳細な説明

推薦する

Mysql マスタースレーブ同期 Last_IO_Errno:1236 エラー解決

Mysql マスタースレーブ同期の Last_IO_Errno:1236 エラーの原因は何ですか? ...

MySQLのnull値に関する小さな問題

今日、null 値をテストしていたところ、小さな問題が見つかりました。ここに記録しました。以前にも遭...

個人的な意見: デザインについて語る

<br />最も実用的なものを選んで話しましょう。まず、勤務先の都市を慎重に選ぶ必要があ...

Reactの二次連携を実現する方法

この記事では、二次リンクを実現するためのReactの具体的なコードを参考までに共有します。具体的な内...

15 分で学べる並列アーティファクト GNU Parallel 入門ガイド

GNU Parallel は、1 台以上のコンピューター上で計算タスクを並列に実行するためのシェル ...

MySQLデータベースの追加、削除、変更操作の詳細な説明

データの挿入テーブル名(列名1、列名2、列名3)の値(値1、値2、値3)に挿入します。ユーザーに(u...

MySQL インデックスの左端原則のサンプルコード

序文最近、MySQL のインデックスについて読んでいました。結合されたインデックスを見ると、左端の原...

JavaScript offsetParent のケーススタディ

1. offsetParentの定義: offsetParentは子要素に最も近い位置に配置された親...

HTMLハイパーリンクaタグのhrefジャンプとonclick間の実行順序の例

HTMLハイパーリンクaタグのhrefジャンプとonclickの実行関係htmlのaタグのhrefは...

WindowsにOpenSSLをインストールし、OpenSSLを使用して公開鍵と秘密鍵を生成します。

1. OpenSSL公式サイト公式ダウンロードアドレス: https://www.openssl....

Vueはダイアログのカプセル化を実装します

目次Vue2 ライティングVue3プラグインのバージョンの記述Vue3 動的コンポーネントの記述書き...

Linux システムで時間を取得して使用する方法

Linux システム時間には 2 種類あります。 (1)暦上の時刻。値は、指定された時刻、1970 ...

Vue+WebSocket ページでの長時間接続のリアルタイム更新

最近、Vue プロジェクトではデータをリアルタイムで更新する必要があります。折れ線グラフは 1 秒ご...

Vue のデータ応答性に関する詳細な理解

目次1. ES 構文のゲッターとセッター2. ES構文でのdefineProperty 3. Vue...

CSS3 フリップカード番号サンプルコード

今日会社から課題をもらったのですが、効果図は以下のとおりです。 どのような効果を実現したいかは特に決...