js では、イベント フローは、ターゲット要素と祖先要素の間でイベントがトリガーされる順序です。イベントの伝播順序に従って、イベント ストリームは次の 2 つのタイプに分類できます: 1. 最も具体的なイベント ターゲットから最も具体性の低いイベント ターゲットにイベントが伝播されるバブル タイプのイベント ストリーム、2. キャプチャ タイプのイベント ストリーム。この場合、イベントは最も具体性の低いイベント ターゲットから最も具体性の高いイベント ターゲットに伝播されます。
このチュートリアルの動作環境: Windows7 システム、JavaScript バージョン 1.8.5、Dell G3 コンピューター。
イベントとは、ドキュメントまたはブラウザ ウィンドウで発生する対話の特定の瞬間です。
イベントとは、ユーザーまたはブラウザ自体によって実行される特定のアクションです。クリック、ロード、マウスオーバーなどはイベントの名前です。
イベントは、JavaScript と DOM の間の架け橋です。
あなたがトリガーした場合は、それを実行します。イベントが発生すると、そのハンドラー関数が呼び出され、対応する JavaScript コードが実行され、応答が返されます。
典型的な例には、ページが読み込まれるときにロード イベントがトリガーされ、ユーザーが要素をクリックしたときにクリック イベントがトリガーされます。
ページ上の要素で特定のイベントがトリガーされると、クリック (クリックされたターゲット要素を除く) の場合、ウィンドウに至るまでのすべての祖先要素がこのイベントをトリガーします。
次に、イベントを最初にターゲット要素でトリガーするか、それとも最初にイベントをトリガーするかという疑問が生じます。先祖要素が最初ですか? これはイベント フローの概念です。
イベント フローは、ターゲット要素と先祖要素の間でイベントがトリガーされる順序です。
初期の IE と Netscape は、まったく逆のイベント フローの概念を提案しました。IE のイベント フローはイベント バブリングであるのに対し、Netscape のイベント フローはイベント キャプチャです。
2 つのイベント フロー モデル
イベントの伝播の順序は、ブラウザーの 2 つのイベント フロー モデル (キャプチャ イベント フローとバブリング タイプ) に対応します。イベントストリーム。
バブル イベント フロー: イベントの伝播は、 から最も具体的な までです。イベント ターゲット から最も具体性の低い イベント ターゲット まで。つまり、DOM ツリーの葉から根までです。 [推奨]
キャプチャ型イベントストリーム: イベントの伝播は##から# 最も具体性の低い イベント ターゲット から最も具体的な イベント ターゲット 。つまり、DOM ツリーのルートから葉までです。 イベント キャプチャの考え方は、特定性の低いノードがイベントをより早く受信し、最も特定性の高いノードが最後にイベントを受信するというものです。
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> </head> <body> <div id="myDiv">Click me!</div> </body> </html>
要素がクリックされています。
です。 #—>>
#—>>#—>>
documentキャプチャ イベント ストリームをクリックします。イベントの伝播は document—>>—>>—>>
です note
:1)、最新のブラウザはすべてイベント バブリングをサポートしていますが、特定の実装の違い:
IE5.5 以前のバージョンでは、イベントのバブリングは 要素をスキップします (本文からドキュメントに直接ジャンプします)。 IE9、Firefox、Chrome、および Safari は、イベントをウィンドウ オブジェクトまでバブルします。 2)、IE9、Firefox、Chrome、Opera、Safari はすべてイベント キャプチャをサポートしています。 DOM 標準ではイベントがドキュメント オブジェクトから伝播される必要がありますが、これらのブラウザはウィンドウ オブジェクトからイベントをキャプチャします。
3). 古いバージョンのブラウザではサポートされていないため、イベント キャプチャを使用する人はほとんどいません。
イベントバブリング
を使用することをお勧めします。2)、DOM イベント フロー
DOM标准采用捕获+冒泡。两种事件流都会触发DOM的所有对象,从document对象开始,也在document对象结束。
DOM标准规定事件流包括三个阶段:事件捕获阶段、处于目标阶段和事件冒泡阶段。
)在捕获阶段不会接收事件。也就是在捕获阶段,事件从document到再到
就停止了。上图中为1~3.上发生并处理。但是事件处理会被看成是冒泡阶段的一部分。
note:
1)、尽管“DOM2级事件”标准规范明确规定事件捕获阶段不会涉及事件目标,但是在IE9、Safari、Chrome、Firefox和Opera9.5及更高版本都会在捕获阶段触发事件对象上的事件。结果,就是有两次机会在目标对象上面操作事件。
2)、并非所有的事件都会经过冒泡阶段 。所有的事件都要经过捕获阶段和处于目标阶段,但是有些事件会跳过冒泡阶段:如,获得输入焦点的focus事件和失去输入焦点的blur事件。
两次机会在目标对象上面操作事件例子:
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> </head> <style> #outer{ position: absolute; width: 400px; height: 400px; top:0; left: 0; bottom:0; right: 0; margin: auto; background-color: deeppink; } #middle{ position: absolute; width: 300px; height:300px; top:50%; left: 50%; margin-left: -150px; margin-top: -150px; background-color: deepskyblue; } #inner{ position: absolute; width: 100px; height:100px; top:50%; left:50%; margin-left: -50px; margin-top: -50px;; background-color: darkgreen; text-align: center; line-height: 100px; color:white; } #outer,#middle,#inner{ border-radius:100%; } </style> <body> <div id="outer"> <div id="middle"> <div id="inner"> click me! </div> </div> </div> <script> var innerCircle= document.getElementById("inner"); innerCircle.addEventListener("click", function () { alert("innerCircle的click事件在捕获阶段被触发"); },true); innerCircle.addEventListener("click", function () { alert("innerCircle的click事件在冒泡阶段被触发"); },false); var middleCircle= document.getElementById("middle"); middleCircle.addEventListener("click", function () { alert("middleCircle的click事件在捕获阶段被触发"); },true); middleCircle.addEventListener("click", function () { alert("middleCircle的click事件在冒泡阶段被触发"); },false); var outerCircle= document.getElementById("outer"); outerCircle.addEventListener("click", function () { alert("outerCircle的click事件在捕获阶段被触发"); },true); outerCircle.addEventListener("click", function () { alert("outerCircle的click事件在冒泡阶段被触发"); },false); </script> </body> </html>
运行效果就是会陆续弹出6个框,为说明原理我整合成了一个图:
【相关推荐:javascript视频教程、web前端】
以上がJavaScriptにおけるイベントストリームとはの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。