1. ホーム
  2. javascript

[解決済み] イベントバブリング、キャプチャーとは何ですか?

2022-03-17 18:04:16

質問

イベントバブリングとキャプチャーの違いは何ですか?バブリングとキャプチャーを使い分けるべきタイミングは?

どのように解決するのですか?

イベントバブリングとキャプチャーとは、HTML DOM API におけるイベントの伝搬方法のひとつで、ある要素で発生したイベントが別の要素の内部で発生し、両方の要素がそのイベントに対するハンドルを登録した場合に発生するものです。イベント伝播のモードは の順にイベントを受け取ります。 .

バブリングでは、イベントはまず最も内側の要素で捕捉・処理され、その後、外側の要素に伝搬されます。

キャプチャリングでは、イベントはまず一番外側の要素で捕捉され、内側の要素に伝搬されます。

Capturingはtricklingとも呼ばれ、伝搬の順番を覚えるのに役立ちます。

<ブロッククオート

ぽろぽろ落ちる、泡立つ

その昔、Netscapeはイベントキャプチャを、Microsoftはイベントバブリングを提唱していました。どちらもW3Cの一部です Document Object Model イベント 規格(2000年)に準拠しています。

IE < 9 は イベントバブリングのみ 一方、IE9+やすべての主要なブラウザは両方をサポートしています。一方 イベントバブリングのパフォーマンスは若干低下する可能性があります。 複雑なDOMの場合

を使用することができます。 addEventListener(type, listener, useCapture) を使用して、バブリング (デフォルト) またはキャプチャーモードのイベントハンドラを登録します。キャプチャリングモードを使用するには、第三引数に true .

使用例

<div>
    <ul>
        <li></li>
    </ul>
</div>

上記の構成で、クリックイベントが li 要素を使用します。

キャプチャリングモデルでは、イベントは div のクリックイベントハンドラ)。 div が最初に起動し)、次に ul そして最後にターゲット要素で。 li .

バブリングモデルでは、その逆で、イベントは最初に li で、次に ul で、最後に div 要素を使用します。

詳しくは

下の例では、ハイライトされた要素のいずれかをクリックすると、イベント伝播フローの捕捉フェーズが最初に発生し、その後にバブリングフェーズが発生することがわかります。

var logElement = document.getElementById('log');

function log(msg) {
    logElement.innerHTML += ('<p>' + msg + '</p>');
}

function capture() {
    log('capture: ' + this.firstChild.nodeValue.trim());
}

function bubble() {
    log('bubble: ' + this.firstChild.nodeValue.trim());
}

function clearOutput() {
    logElement.innerHTML = "";
}

var divs = document.getElementsByTagName('div');
for (var i = 0; i < divs.length; i++) {
    divs[i].addEventListener('click', capture, true);
    divs[i].addEventListener('click', bubble, false);
}
var clearButton = document.getElementById('clear');
clearButton.addEventListener('click', clearOutput);
p {
    line-height: 0;
}

div {
    display:inline-block;
    padding: 5px;

    background: #fff;
    border: 1px solid #aaa;
    cursor: pointer;
}

div:hover {
    border: 1px solid #faa;
    background: #fdd;
}
<div>1
    <div>2
        <div>3
            <div>4
                <div>5</div>
            </div>
        </div>
    </div>
</div>
<button id="clear">clear output</button>
<section id="log"></section>

JSFiddleでの別の例 .