ホームページ ウェブフロントエンド jsチュートリアル JavaScript のイベント モデルをすばやく理解するのに役立ちます

JavaScript のイベント モデルをすばやく理解するのに役立ちます

Jan 22, 2018 am 09:59 AM
javascript js イベント

この記事では、主に javascript のイベント モデルを紹介します。これには、DOM0 レベルのイベント モデルと DOM2 レベルのイベント モデル (イベント キャプチャとイベント バブリング、DOM2 レベルの登録イベントと非アクティブ化イベント) が含まれます。こちらの記事を参考にしてください

JavaScriptにはDOM0とDOM2という2つのイベントモデルがあります。この 2 つの時代のモデルについては、今までよくわかりませんでしたが、ネットで情報を調べてようやく少し理解できました。

1. DOMレベル0イベントモデル

DOMレベル0イベントモデルは、すべてのブラウザでサポートされている初期のイベントモデルであり、その実装は比較的簡単です。コードは次のとおりです:

<p id = &#39;click&#39;>click me</p>
<script>
 document.getElementById(&#39;click&#39;).onclick = function(event){
  alert(event.target);
 }
</script>
ログイン後にコピー

この種のイベント モデルは、dom オブジェクト にイベント名を直接登録します。このコードは、p タグに onclick イベントを登録し、イベント関数内でクリック ターゲットを出力します。イベントを閉じるのはさらに簡単で、次のように null をイベント関数にコピーするだけです:

document.getElementById(&#39;click&#39;_).onclick = null;
このことから、dom0 では、dom オブジェクトは同じ型の関数を 1 つだけ登録できることがわかります。同じ種類を登録すると上書きされ、以前に登録した機能は無効となります。

var click = document.getElementById(&#39;click&#39;);
click.onclick = function(){
 alert(&#39;you click the first function&#39;);
};
click.onclick = function(){
 alert(&#39;you click the second function&#39;)
}
ログイン後にコピー

このコードではDOMオブジェクトに対して2つのonclick関数を登録しましたが、結果として2番目に登録された関数のみが実行され、先に登録された関数は上書きされてしまいました。

2. DOM2レベルのイベントモデル

1. イベントキャプチャとイベントバブリング(キャプチャ、バブル)

まず、IE8以下はこのイベントモデルをサポートしていません。イベントキャプチャとイベントバブリングのメカニズムは次のとおりです:

上図に示すように、123 はイベントキャプチャを表し、4567 はイベントバブリングを表します。まず次のコードを使用します:

<p id = &#39;outer&#39; style = &#39;margin: 100px 0 0 100px; width: 200px;height: 200px; background: red;&#39;>
 <p id="inner" style = &#39;margin-left:20px; width: 50px;height:50px; background: green;&#39;></p>
</p>
ログイン後にコピー


ID inner で p をクリックすると、このときのイベント フローは最初にキャプチャ フェーズ: document-html-body-p (outer) を実行します。次に、バブリング フェーズ、p(inner)-p(outer)-body-html-document を実行します。

2. DOM2レベルでのイベントの登録と非アクティブ化

DOM2レベルでaddEventListenerとremoveEventListenerを使用して、イベントの登録と非アクティブ化を行います(IE8以前のバージョンではサポートされていません)。この関数の以前の方法と比較した利点は、DOM オブジェクトに同じ種類のイベントを複数登録でき、イベントの上書きが発生せず、各イベント関数が順番に実行されることです。

addEventListener('イベント名', 'イベントコールバック', 'キャプチャ/バブル')。例は次のとおりです。

<p id = &#39;outer&#39; style = &#39;margin: 100px 0 0 100px; width: 200px;height: 200px; background: red;&#39;>
 <p id="inner" style = &#39;margin-left:20px; width: 50px;height:50px; background: green;&#39;></p>
</p>
<script>
 var click = document.getElementById(&#39;inner&#39;);
 click.addEventListener(&#39;click&#39;,function(){
  alert(&#39;click one&#39;);
 },false);
 click.addEventListener(&#39;click&#39;,function(){
  alert(&#39;click two&#39;);
 },false);
</script>
ログイン後にコピー

まず、addEventListenr の最初のパラメータがイベント名であることを知っておく必要があります。また、3 番目のパラメータはキャプチャまたはバブリングを表します。はキャプチャ イベントを表し、false はバブル イベントを表します。

このコードでは、inner p に 2 つのクリック イベント関数を登録しました。その結果、ブラウザーはこれら 2 つの関数を順番に実行します。
ここで、イベントストリーム生成メカニズムの使用方法を説明します。

<p id = &#39;outer&#39; style = &#39;margin: 100px 0 0 100px; width: 200px;height: 200px; background: red;&#39;>
 <p id="inner" style = &#39;margin-left:20px; width: 50px;height:50px; background: green;&#39;></p>
</p>
<script>
 var click = document.getElementById(&#39;inner&#39;);
 var clickouter = document.getElementById(&#39;outer&#39;);
 click.addEventListener(&#39;click&#39;,function(){
  alert(&#39;inner show&#39;);
 },true);
 clickouter.addEventListener(&#39;click&#39;,function(){
  alert(&#39;outer show&#39;);
 },true);
</script>
ログイン後にコピー

このコードでは、キャプチャ イベントを使用します。inner は external にネストされているため、capture を使用する場合は、outer が最初にイベントをキャプチャする必要があり、その後、inner がイベントをキャプチャできることがわかります。その結果、外側が最初に実行され、次に内側が実行されます。

ではアウターの実行タイミングをバブリング段階に変更したらどうなるでしょうか?

alickouter.addEventListener(&#39;click&#39;,function(){
 alert(&#39;outer show&#39;); 
},false);
ログイン後にコピー

この場合、最初にinnerが実行され、次にouterが実行されます。同様に、両方のイベントの実行タイミングをバブリング ステージに変更した場合でも、内側が最初に実行され、次に外側が実行されます。次に、別の問題が発生します。つまり、内部に 2 つのクリック イベントを登録すると、1 つはキャプチャ段階にあり、もう 1 つはバブリング段階にあります。つまり、addEventListenter の 3 番目のパラメーターがそれぞれ false と true に設定されます。を実行してから、 の順序は何ですか。

<script>
 var click = document.getElementById(&#39;inner&#39;);
 var clickouter = document.getElementById(&#39;outer&#39;);
 click.addEventListener(&#39;click&#39;,function(){
  alert(&#39;capture show&#39;);
 },true);
 click.addEventListener(&#39;click&#39;,function(){
  alert(&#39;bubble show&#39;);
 },false);
</script>
ログイン後にコピー

この場合、最初にやるべきことはキャプチャショーで、次にバブルショーです。ただし、この結果は登録の順序に関係します。最初に登録したものが最初に実行されます。イベント キャプチャとイベント バブリングの図を見ているため、最終的には特定の DOM オブジェクトが 1 つだけであることがわかります。

それでは、アウターとインナーの両方にクリックイベントを登録して、アウターは実行したくない場合はどうなるでしょうか?このとき、stopPropagation 関数を使用する必要があります。この関数はバブリングを防止するために使用され、同じ種類のイベントを登録する DOM オブジェクトが実行されないようにすることを意味します。

たとえば、カスタム ドロップダウン ボックスを作成する場合、ブラウザ内の他の場所をクリックし、ドロップダウン ボックスのオプションを非表示にする必要があります。この場合、stopPropagation を使用する必要があります。以下の通り:

<script>
 var click = document.getElementById(&#39;inner&#39;);
 var clickouter = document.getElementById(&#39;outer&#39;);
 click.addEventListener(&#39;click&#39;,function(event){
  alert(&#39;inner show&#39;);
  event.stopPropagation();
 },false);
 clickouter.addEventListener(&#39;click&#39;,function(){
  alert(&#39;outer show&#39;);
 },false);
</script>
ログイン後にコピー

  正常的情况下,我们在不添加stopPropagation函数时,首先应该执行inner,然后执行outer,但是当我们在inner的事件函数中添加了stopPropagation函数之后,执行完inner的事件函数之后,就不会在执行outer的事件函数了,也可以理解为事件冒泡到inner之后就消失了,因此也就不会在执行接下来的事件函数了。

  由于事件捕获阶段没有可以阻止事件的函数,所以一般都是设置为事件冒泡。

相关推荐:

JavaScript实现为事件句柄绑定监听函数实例详解

JavaScript文件的同步和异步加载的实现代码

JavaScript 完成注册页面表单校验的实例

以上がJavaScript のイベント モデルをすばやく理解するのに役立ちますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

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

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

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

推奨: 優れた JS オープンソースの顔検出および認識プロジェクト 推奨: 優れた JS オープンソースの顔検出および認識プロジェクト Apr 03, 2024 am 11:55 AM

顔の検出および認識テクノロジーは、すでに比較的成熟しており、広く使用されているテクノロジーです。現在、最も広く使用されているインターネット アプリケーション言語は JS ですが、Web フロントエンドでの顔検出と認識の実装には、バックエンドの顔認識と比較して利点と欠点があります。利点としては、ネットワーク インタラクションの削減とリアルタイム認識により、ユーザーの待ち時間が大幅に短縮され、ユーザー エクスペリエンスが向上することが挙げられます。欠点としては、モデル サイズによって制限されるため、精度も制限されることが挙げられます。 js を使用して Web 上に顔検出を実装するにはどうすればよいですか? Web 上で顔認識を実装するには、JavaScript、HTML、CSS、WebRTC など、関連するプログラミング言語とテクノロジに精通している必要があります。同時に、関連するコンピューター ビジョンと人工知能テクノロジーを習得する必要もあります。 Web 側の設計により、次の点に注意してください。

PHP および JS 開発のヒント: 株価ローソク足チャートの描画方法をマスターする PHP および JS 開発のヒント: 株価ローソク足チャートの描画方法をマスターする Dec 18, 2023 pm 03:39 PM

インターネット金融の急速な発展に伴い、株式投資を選択する人がますます増えています。株式取引では、ローソク足チャートは一般的に使用されるテクニカル分析手法であり、株価の変化傾向を示し、投資家がより正確な意思決定を行うのに役立ちます。この記事では、PHP と JS の開発スキルを紹介し、株価ローソク足チャートの描画方法を読者に理解してもらい、具体的なコード例を示します。 1. 株のローソク足チャートを理解する 株のローソク足チャートの描き方を紹介する前に、まずローソク足チャートとは何かを理解する必要があります。ローソク足チャートは日本人が開発した

簡単な JavaScript チュートリアル: HTTP ステータス コードを取得する方法 簡単な JavaScript チュートリアル: HTTP ステータス コードを取得する方法 Jan 05, 2024 pm 06:08 PM

JavaScript チュートリアル: HTTP ステータス コードを取得する方法、特定のコード例が必要です 序文: Web 開発では、サーバーとのデータ対話が頻繁に発生します。サーバーと通信するとき、多くの場合、返された HTTP ステータス コードを取得して操作が成功したかどうかを判断し、さまざまなステータス コードに基づいて対応する処理を実行する必要があります。この記事では、JavaScript を使用して HTTP ステータス コードを取得する方法を説明し、いくつかの実用的なコード例を示します。 XMLHttpRequestの使用

jsとvueの関係 jsとvueの関係 Mar 11, 2024 pm 05:21 PM

js と vue の関係: 1. Web 開発の基礎としての JS、2. フロントエンド フレームワークとしての Vue.js の台頭、3. JS と Vue の補完関係、4. JS と Vue の実用化ビュー。

JavaScript で HTTP ステータス コードを簡単に取得する方法 JavaScript で HTTP ステータス コードを簡単に取得する方法 Jan 05, 2024 pm 01:37 PM

JavaScript で HTTP ステータス コードを取得する方法の紹介: フロントエンド開発では、バックエンド インターフェイスとの対話を処理する必要があることが多く、HTTP ステータス コードはその非常に重要な部分です。 HTTP ステータス コードを理解して取得すると、インターフェイスから返されたデータをより適切に処理できるようになります。この記事では、JavaScript を使用して HTTP ステータス コードを取得する方法と、具体的なコード例を紹介します。 1. HTTP ステータス コードとは何ですか? HTTP ステータス コードとは、ブラウザがサーバーへのリクエストを開始したときに、サービスが

jQueryで選択要素の変更イベントバインディングを実装する方法 jQueryで選択要素の変更イベントバインディングを実装する方法 Feb 23, 2024 pm 01:12 PM

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

PHP を使用してイベントベースのアプリケーションを構築する方法 PHP を使用してイベントベースのアプリケーションを構築する方法 May 04, 2024 pm 02:24 PM

PHP でイベントベースのアプリケーションを構築する方法には、EventSourceAPI を使用してイベント ソースを作成する方法と、EventSource オブジェクトを使用してクライアント側でイベントをリッスンする方法が含まれます。 Server Sent Events (SSE) を使用してイベントを送信し、XMLHttpRequest オブジェクトを使用してクライアント側でイベントをリッスンします。実際の例は、EventSource を使用して、電子商取引 Web サイトの在庫数をリアルタイムで更新することです。これは、サーバー側で在庫をランダムに変更して更新を送信することで実現され、クライアントは EventSource を通じて在庫の更新をリッスンし、それらを表示します。リアルタイム。

JSのAI時代が到来! JSのAI時代が到来! Apr 08, 2024 am 09:10 AM

JS-Torch の概要 JS-Torch は、構文が PyTorch に非常に似ている深層学習 JavaScript ライブラリです。これには、完全に機能するテンソル オブジェクト (追跡された勾配で使用可能)、深層学習レイヤーと関数、および自動微分エンジンが含まれています。 JS-Torch は JavaScript での深層学習の研究に適しており、深層学習の開発を加速するための便利なツールや機能を多数提供します。 Image PyTorch は、Meta の研究チームによって開発および保守されているオープンソースの深層学習フレームワークです。ニューラル ネットワーク モデルを構築およびトレーニングするための豊富なツールとライブラリのセットを提供します。 PyTorch は、シンプル、柔軟、そして使いやすいように設計されており、その動的な計算グラフ機能により、

See all articles