jsのイベントオブジェクトを深く理解しましょう

jsのイベントオブジェクトを深く理解しましょう

JS でよく使用されるイベントは次の通りです。

  • ページイベント: load;
  • フォーカス イベント: フォーカス、ぼかし。
  • マウス イベント: クリック、マウスアウト、マウスオーバー、マウス移動など。
  • キーボード イベント: keydown、keyup、keypress;
  • フォーム イベント: リセット、送信;
  • コンテンツ変更イベント: 変更、入力

では、JS の「イベント オブジェクト」とは一体何でしょうか?

まず、イベントとは何でしょうか?

まず、JS はいくつかの動的な操作を実装するために使用され、ユーザーはフォームの送信、マウスのクリックなどの機能を実装したい場合があり、そのためにはブラウザーでこのイベントをトリガーする必要があります。次に、ブラウザーはユーザーの行動を認識 (またはキャプチャ) し、イベントに応答して処理します。これをイベントと呼びます。

では、イベント オブジェクトを生成する理由は何でしょうか?

ほとんどの場合、イベントのトリガーはユーザーが実行したいアクションです。つまり、ユーザーがいつイベントをトリガーするかはわかりません。さらに、イベントの伝播メカニズムにより、どのノードでイベントがトリガーされるかさえわかりません。これは頭の痛い問題です。

この問題を解決するために、イベントが発生した後、システムはそれを解決するために作成したイベント ハンドラー (コード) を呼び出します。

すると、イベント オブジェクトとは何かという疑問が生じます。

ハンドラを呼び出すと、システムはイベントに関するすべての情報をオブジェクトにカプセル化し、それをパラメータとしてリスニング関数 (イベント ハンドラ) に渡します。したがって、このオブジェクトはイベント オブジェクトと呼ばれます。

イベントの種類に応じて、イベント オブジェクトに含まれる情報も異なります。たとえば、クリック イベントの場合は、マウス クリックの水平座標と垂直座標が含まれ、キーボード イベントの場合は、キーボード キーの値などが含まれます。

<本文>
 <div id="div">
 <p>ppp</p>
 </div>
 <入力タイプ="テキスト" 値="" id="i">
</本文>
<スクリプト>
var d = document.getElementById('div');
//マウスイベント d.addEventListener('click',function(e){
 コンソールログ(e);
});
var i = document.getElementById('i');
//キーボードイベント i.addEventListener('keydown',k);
関数k(e){
 コンソールログ(e);
}
</スクリプト>

イベント オブジェクトの意味がわかったので、イベント オブジェクトのプロパティとメソッドを見てみましょう。

(1)一般的な属性:

event.bubbles: 現在のイベントがバブルするかどうかを示すブール値を返します。

event.eventPhase: 伝播フェーズにおけるイベントストリームの位置を示す整数値を返します。

0: イベントは現在発生していません。
1: イベントは現在キャプチャフェーズにあります。
2: イベントがターゲットノードに到達します。
3: イベントは盛り上がり段階にあります。

event.type: 大文字と小文字を区別してイベント タイプを示す文字列を返します。

event.timeStamp: イベントが発生した時刻を示すミリ秒のタイムスタンプを返します。

clientX、clientY: マウスイベントのX、Y座標を取得します。

イベントオブジェクト

(2)イベントプロキシ/デリゲートプロパティ:

event.target: イベント トリガーへの参照。トリガー イベントが発生したノードを返します。 (ポイント)

event.currentTarget: イベントが現在配置されているノード、つまり実行中のリスニング関数がバインドされているノードを返します。 (ただ理解するだけ)

 var d = document.getElementById('d');
 d.onclick = 関数(e){
 //イベントノードを返します console.log(e.currentTarget);
 //トリガーノードに戻る console.log(e.target);
 }

イベント プロキシ (イベント委任) の意味: イベントはバブリング段階で親ノードに上向きに伝播するため、子ノードのリスニング関数を親ノード上に定義することができ、親ノードのリスニング関数は複数の子要素のイベントを均一に処理します。このメソッドはイベント プロキシと呼ばれ、イベント プロキシまたはイベント委任とも呼ばれます。

<ヘッド>
 <タイトル></タイトル>
 <メタ文字セット="UTF-8">
 <スタイル>
 div{パディング: 40px}
 #div3{幅: 300px;高さ: 300px;境界線: 1px 赤一色;}
 #div2{幅: 200px;高さ: 200px;境界線: 1px 赤一色;}
 #div1{幅: 100px;高さ: 100px;境界線: 1px 赤一色}
 </スタイル>
</head>
<本文>
 <div id="div3">div3
 <div id="div2">div2
  <div id="div1">div1</div>
 </div>
 </div>
</本文>
<スクリプト>
 var d = document.getElementById('div3');
 d.onclick = 関数(e){
 e.target.style.background = '赤';
 }
</スクリプト>

上記のコードによると、3 つの div の位置はおおよそ次のようになります。各 div をクリックすると、div 全体が赤に変わります。主に、e.target はクリックによってトリガーされたノードを返します。

(3) ブラウザのデフォルト動作を防止し、イベントの伝播を防ぐ方法 event.preventDefault(): この方法は、ブラウザが現在のイベントのデフォルト動作を実行しないようにします。たとえば、リンクをクリックするとブラウザは指定されたページにジャンプします。または、スペースバーを押すとページが一定距離下にスクロールします。 event.stopPropagation(): このメソッドは、DOM 構造内でイベントが伝播し続けるのを停止し、他のノードで定義されたリスニング関数のトリガーを防ぎます。

<本文>
 <div id="div2">2
 <div id="div1">1
  <a id="a" href="Baidu 2">私の明るい月の匂いはますます嗅ぎたくなる</a>
 </div>
 </div>
</本文>
<スクリプト>
 var d2 = document.getElementById('div2');
 var d1 = document.getElementById('div1');
 var a = document.getElementById('a');
 d2.onclick = 関数(e){
 アラート('d2');
 }
 d1.onclick = 関数(e){
 アラート('d1');
 }
 a.onclick = 関数(e){
 //イベントの伝播を停止します e.stopPropagation();
 警告('a');
 //ブラウザのデフォルトの動作を防止する e.preventDefault();
 }
</スクリプト> 

イベント オブジェクトを使用して、簡単な例を実装します。マウスに追従する div (イベント オブジェクトの XY 値を変更することによって)

<本文>
 <div id="div2">2
 <div id="div1">1
  <a id="a" href="Baidu 2">私の明るい月の匂いはますます嗅ぎたくなる</a>
 </div>
 </div>
</本文>
<スクリプト>
 var d2 = document.getElementById('div2');
 var d1 = document.getElementById('div1');
 var a = document.getElementById('a');
 d2.onclick = 関数(e){
 アラート('d2');
 }
 d1.onclick = 関数(e){
 アラート('d1');
 }
 a.onclick = 関数(e){
 //イベントの伝播を停止します e.stopPropagation();
 警告('a');
 //ブラウザのデフォルトの動作を防止する e.preventDefault();
 }
</スクリプト> 

クリック前(動きなし)

クリック後(マウスに従う)

要約する

js のイベント オブジェクトに関するこの記事はこれで終わりです。より関連性の高い js イベント オブジェクトについては、123WORDPRESS.COM の以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • js のイベント オブジェクトとイベント委任の概要
  • JavaScript イベントオブジェクトの詳細な説明
  • JavaScript イベントオブジェクトのイベント使用状況の分析
  • JavaScript イベント フロー、イベント ハンドラー、イベント オブジェクトの概要
  • Javascript イベントオブジェクトについての簡単な説明
  • jsオブジェクトとイベントの学習ノートを見てみましょう

<<:  Linux centos7 環境での MySQL インストール チュートリアル

>>:  Linux カーネルの探究: Kconfig の秘密

推薦する

Dapr を使用してマイクロサービスをゼロから簡素化する例

目次序文1. Dockerをインストールする2. Dapr CLIをインストールする3. Net6 ...

Navicat Premiumを使用してMySQLデータベースにリモート接続する方法

新しい接続を作成する側がクライアントに相当し、接続される側がサーバーに相当します。手順は次のとおりで...

Docker で Harbor パブリック リポジトリを構築する方法の例

前回のブログ投稿では、レジストリのプライベート ウェアハウスについて説明しました。今日は、Harbo...

ルート変更を監視するJavaScriptの詳細な説明

目次歴史pushState() メソッドpushState() の使用シナリオreplaceStat...

IE をフリーズさせる HTML コード

任意のテキスト エディターを開き、次のコードをコピーして、たとえば SomeFilename.htm...

Centos7 に MySQL 8.0.23 をインストールする手順 (初心者レベル)

まず、MySQL とは何かを簡単に紹介します。簡単に言えば、データベースはデータを格納するための倉庫...

Vue プロジェクトでのスキャンコード決済の実装例 (デモ付き)

目次需要背景思考分析UI 表示始める1. 支払いコンポーネントテンプレートを作成する2. 支払いコン...

Ubuntu ベースのディストリビューションに Microsoft TrueType フォントをインストールするチュートリアル

Linux 上の LibreOffice で Microsoft ドキュメントを開くと、フォントが少...

Linux で同じ内容のファイルを識別する方法の詳細な説明

序文ファイルのコピーによってハードドライブのスペースが大量に浪費され、ファイルを更新するときに混乱が...

Vue3.0 ルーティング自動インポート方法の例

1. 前提条件インポートには require.context メソッドを使用します。vite で作成...

CentOS 7 での Nginx ログタイミング分割の実装手順の詳細説明

1. 分割スクリプト (splitNginxLog.sh) を作成します。 * この例では、ログ分割...

vuex で履歴を実装するためのサンプルコード

私は最近、ユーザー操作を元に戻す、またはやり直す機能を備えたビジュアル操作プラットフォームを開発して...

JavaScript でオブジェクトをエレガントに扱う 6 つの方法

目次序文1. オブジェクト.freeze() 2. オブジェクト.seal() 3. オブジェクト....

jsシミュレーションでJingdongの詳細ページで画像を拡大する効果を実現

この記事では、Jingdongの詳細ページの画像の拡大を実現するためのjsの具体的なコードを紹介しま...