ホームページ  >  記事  >  ウェブフロントエンド  >  [JavaScript] 2 つのまったく逆のイベント フロー: イベント バブリングとイベント キャプチャ

[JavaScript] 2 つのまったく逆のイベント フロー: イベント バブリングとイベント キャプチャ

php是最好的语言
php是最好的语言オリジナル
2018-08-02 09:13:262013ブラウズ

イベントとは何ですか?

イベントは、ドキュメントとブラウザ ウィンドウ内で発生する対話の特定の瞬間です。

イベント フローとは:

イベント フローは、ページからイベントを受け取る順序を記述しますが、興味深いことに、Microsoft (IE) と Netscape (Netscape) の開発チームは、実際には 2 つの完全に反対のイベント ストリームの概念を提案しました。 IE のイベント ストリームはイベント バブリング ストリーム (イベント バブリング) ですが、Netscape のイベント ストリームはイベント キャプチャ ストリーム (イベント キャプチャ) です。

最初のタイプ: イベントバブリング

IE が提案するイベント フローはイベント バブリングと呼ばれます。つまり、イベントは最初に最も具体的な要素によって受信され、その後、より具体的ではないノードに段階的に上向きに伝播します。 step

p——>body——>html——>document

2 番目のタイプ: イベント キャプチャ

より具体的でないノードはイベントをより早く受信し、最も具体的なノードは最後にイベントを受信する必要がありますイベント。キャプチャの目的は、イベントが目的の宛先に到達する前にイベントをキャプチャすることです。

document——>html——>body——>p

DOMイベントフロー

「DOM2レベルイベント」で指定されるイベントフローには、イベントキャプチャステージ、ターゲットステージ、イベントの3つのステージが含まれますバブリングフェーズ

DOM イベントフローでは、実際のターゲットはキャプチャフェーズ中にイベントを受信しません。つまり、キャプチャフェーズ中、イベントは本体に到達した後に停止します。次のステージはターゲット ステージにあるため、イベントは p で発生し、イベント処理のバブリング ステージの一部とみなされます。次に、バブリングフェーズが発生し、イベントがドキュメントに伝播されます。

「DOM2 レベルのイベント」仕様では、キャプチャ フェーズにイベント ターゲットが関与しないことが明確に要求されていますが、現在の主流ブラウザはキャプチャ フェーズ中にイベント オブジェクトでイベントをトリガーします。その結果、ターゲット オブジェクトのイベントを操作する機会が 2 つ存在します。

DOM レベル 2 イベント ハンドラー

DOM レベル 2 イベントは、追加イベントと削除イベントを処理するための操作の 2 つのメソッドを定義します。

イベントの追加 addEventListener() イベントの削除 deleteEventListener()

すべての DOM ノード これら 2 つが含まれます(1) 処理されるイベント メソッド (例: click、mouseover、dbclick...) (2) イベント処理関数は、匿名関数または名前付き関数にすることができます。 function (ただし、イベントを削除する必要がある場合は、名前付き関数である必要があります) (3) イベント バブリング ステージにあるか、イベント キャプチャ ステージにあるかを表すブール値 (true: キャプチャ ステージでイベント ハンドラーを呼び出すことを意味します) stage; false : イベント ハンドラーがバブリング フェーズ中に呼び出されることを示します)

//这是一个DOM 2级事件 添加事件最简单的方式(此时添加的是一个匿名函数)
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

    <button>按钮</button>
    <script>
        var btn=document.querySelector(&#39;button&#39;);
        btn.addEventListener(&#39;click&#39;,function(){
            console.log(&#39;我是按钮&#39;)
        },false)   //当第三个参数不写时,也是默认为false(冒泡时添加事件)
    </script>

</body>
</html>
//添加的函数是命名函数,removeEventListener需要用这种方式
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

    <button>按钮</button>
    <script>
        var btn=document.querySelector(&#39;button&#39;);
        btn.addEventListener(&#39;click&#39;,foo,false);
        function foo(){
            console.log(&#39;我是按钮&#39;)
        }
           //其实操作就是把写在里面的函数拿到了外面,而在原来的位置用函数名来代替
    </script>
</body>
</html>

DOM2 レベルのハンドラーは 2 つのイベント処理イベントの追加もサポートしており、両方のイベントが実行されます

ほとんどの場合、イベント ハンドラーを

に追加します。さまざまなブラウザとの互換性を最大限に高めることができる、イベント ストリーム

のバブリング フェーズ。 イベントがターゲットに到達する前に

イベントをインターセプトする必要がある場合にのみ、イベント ハンドラーをキャプチャ フェーズに追加することをお勧めします。

特に必要がない場合、イベント キャプチャ フェーズ中にイベント ハンドラーを登録することはお勧めしません。

イベントのバブリングを防ぐ

は、主にイベントの伝播を防ぐために使用されます。他の DOM ノードにディスパッチされるのを防ぎ、イベント伝播のどの段階でも使用できます。使用方法は以下の通りです(IE互換):

function stopBubble(event){
	if(window.event){
        //兼容IE
		window.event.cancelBubble=true;
	}else{
		event.stopPropagation();
	}
}

デフォルトイベントをブロック

function stopDefaultEvent(event){
	if(window.event){
        //兼容IE
		window.event.returnValue=false;
	}else{
		event.preventDefault()
	}
	return false;
}

関連記事:

JSのバブリングイベントとイベントキャプチャの例を詳しく解説

JavaSriptのイベントバブリングとイベントキャプチャの実装方法

関連ビデオ:

JS 抽象クラスとイベント設計パターンのビデオ チュートリアル

以上が[JavaScript] 2 つのまったく逆のイベント フロー: イベント バブリングとイベント キャプチャの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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