目次
1. EventTarget イベント ターゲットの検索方法 (バブルとキャプチャ)
三、e.target与e.currentTarget的区别:
四、阻止冒泡与捕获
六、取消默认事件
ホームページ ウェブフロントエンド jsチュートリアル JavaScript でのイベントのバブリングとキャプチャの詳細については、こちらをご覧ください。

JavaScript でのイベントのバブリングとキャプチャの詳細については、こちらをご覧ください。

Aug 04, 2022 pm 09:01 PM
javascript イベントバブリング イベントをキャプチャする イベントエージェント

この記事では、イベントのバブリングとキャプチャについて説明し、JS イベント ターゲットの検索方法 (バブリングとキャプチャ)、イベント プロキシ、e.target と e.currentTarget の違い、バブリングとキャプチャの防止、キャンセルについて理解できるようにします。デフォルトのイベントです。皆さんのお役に立てば幸いです!

1. EventTarget イベント ターゲットの検索方法 (バブルとキャプチャ)

イベント ターゲットとは、イベントがバインドされている要素 elemet を指します。 .addEventListener('click',function(){}) ここの要素はイベント ターゲットです。

#バブリングとキャプチャ:

  • #バブル イベント:

    イベントはデフォルトで下から上にバブリング実行されます。クリック イベントを例に挙げると、子要素をクリックすると、親要素以降のクリック イベントもトリガーできます。イベントの実行順序は下から上、つまりバブリング イベントです。
  • イベントのキャプチャ:

    もちろん、トップダウンのキャプチャ方法もあります。引き続きクリック イベントを例に挙げると、子要素がクリック イベントにバインドされ、その子要素をクリックすると、親要素およびその上の要素にバインドされたクリック イベントも実行されます。イベントの実行順序は上から下、つまりキャプチャ イベントです。
addEventListener(type,listener,useCapture) 単純な分析:

type: イベント タイプ

    listener: イベントリスニング処理関数
  • useCapture: イベントの検索方法を設定
  • false、バブリングイベント (デフォルト値)
    • true、イベントをキャプチャ
パラメータの使用キャプチャ分析:

重要なポイント! !イベント ターゲットをトリガーするプロセス全体は 2 つの段階 (キャプチャとバブリング) に分かれています。 useCapture この値は、イベント ターゲットのトリガーがどの段階で実行されるかを決定します。

バブリングとキャプチャーのシーケンス分析:

JavaScript でのイベントのバブリングとキャプチャの詳細については、こちらをご覧ください。それがわかります。この図から、イベントが最初にキャプチャされ、次にイベントがバブルされることがわかります。イベント キャプチャは上から下に行われ (外部イベントが最初にトリガーされます)、イベント バブリングは下から上に行われます (内部イベントが最初にトリガーされます)。

    キャプチャのプロセスは非特異的から特異的であり、バブリングは特異的から非特異的です。
  • キャプチャが優先されます
  • が、バブリング イベントがデフォルトの配信方法です。これは、イベントがデフォルトでバブリング段階でトリガーされることを意味します。 ############ポイント! !イベントターゲットの探索は「バブル」と「キャプチャ」の2段階に分かれており、ステージによってイベントターゲットが発生する順番が異なります。ネストされた要素にキャプチャとバブルの両方が存在する場合、キャプチャが優先される必要があり、キャプチャ フェーズのイベントが実行された後、バブリング フェーズのイベントが実行されます。
  • コードのデモ:

        <div>
            这是div1
            <div>
                这是div2
                <div>这是div3</div>
            </div>
        </div>
        <script>
            let div1 = document.getElementById(&#39;div1&#39;);
            let div2 = document.getElementById(&#39;div2&#39;);
            let div3 = document.getElementById(&#39;div3&#39;);
            div1.addEventListener(&#39;click&#39;,function(){
                console.log("这是div1的点击事件");
            },false);
            div2.addEventListener(&#39;click&#39;,function(){
                console.log("这是div2的点击事件");
            },false);
            div3.addEventListener(&#39;click&#39;,function(){
                console.log("这是div3的点击事件");
            },false);
        </script>
    
    ログイン後にコピー
    以下のコンソール結果からわかるように、div3 をクリックすると、ここにイベントが表示されます。バブリングフェーズ中に実行されます。

[div3] をクリックしたまま、

div1.addEventListener

の 3 番目のパラメータを true に変更します。以下に示すように、div1 が最初に実行され、キャプチャが行われたことを示します。バブリングフェーズを優先します。

JavaScript でのイベントのバブリングとキャプチャの詳細については、こちらをご覧ください。

これを読んだ後は、必ず入力してください。すべての状況をリストしたわけではありません。残りの状況は、要約してみるために残しておきます (これだけで十分です)上記を理解してください。実際のコーディングはそれほど複雑ではありません)。 上記は、イベント ターゲット検索の 2 つのメカニズム

Bubbles

JavaScript でのイベントのバブリングとキャプチャの詳細については、こちらをご覧ください。Capture

についての私の理解です。

2. イベント プロキシ メカニズム (イベント委任)

イベント バブリングを使用してイベント プロキシ メカニズムを完成させます:

ログイン後にコピー
        
  • 列表1
  •     
  • 列表2

クリック イベントを上記のリストの

li にバインドする必要がある場合、クリックして li のコンテンツを取得します。通常、要素をトラバースしてクリック イベントをバインドします。

let lis = document.querySelectorAll('li');
for (let i = 0; i 
ログイン後にコピー
ノードが 10,000 個ある場合、上記の方法を使用して 10,000 個のイベントをバインドする必要があり、これはコードのパフォーマンスに大きな影響を与えます。したがって、バブリング メカニズムを使用して上記の問題を解決できます。つまり、イベントを親要素 ul

にバインドします。次のコードを見てください:

    
ログイン後にコピー
            
  • 列表1
  •         
  • 列表2
  •     
    <script> let ul = document.querySelector(&#39;ul&#39;); //我们可以通过事件对象(e)中的target属性可以访问到事件源(也就事件的触发元素) ul.addEventListener(&#39;click&#39;,function(e){ console.log(e.target.innerHTML); },false); </script> Event オブジェクト (e): addEventListener バインディング イベントであっても、直接の「.event name」であっても、イベント リスニング処理関数の最初のパラメーターは event です。物体###。イベント オブジェクトには、イベントに関する詳細情報が含まれます。たとえば、このオブジェクトには、

イベント ソース、イベント ID、イベント タイプ、イベント バインド要素、イベントがトリガーされたときのクリック位置などが含まれます。 このうち、e.target は、このイベントのトリガー元であるイベント ソースにアクセスできます。 <p><strong>既然能给父元素绑定事件监听,又能拿到触发的源头。所以我们通过“e.target”+“冒泡机制”就可以减少事件的绑定,能提升不少的性能。</strong></p> <p>依次点击列表1与列表2:</p> <p><img src="https://img.php.cn/upload/image/607/859/198/165961728965853JavaScript%20%E3%81%A7%E3%81%AE%E3%82%A4%E3%83%99%E3%83%B3%E3%83%88%E3%81%AE%E3%83%90%E3%83%96%E3%83%AA%E3%83%B3%E3%82%B0%E3%81%A8%E3%82%AD%E3%83%A3%E3%83%97%E3%83%81%E3%83%A3%E3%81%AE%E8%A9%B3%E7%B4%B0%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6%E3%81%AF%E3%80%81%E3%81%93%E3%81%A1%E3%82%89%E3%82%92%E3%81%94%E8%A6%A7%E3%81%8F%E3%81%A0%E3%81%95%E3%81%84%E3%80%82" title="165961728965853JavaScript でのイベントのバブリングとキャプチャの詳細については、こちらをご覧ください。" alt="JavaScript でのイベントのバブリングとキャプチャの詳細については、こちらをご覧ください。"></p> <p><strong>总结:通过上面代码我们知道了“事件对象”+“冒泡机制”可以实现事件委托。事件委托就是当事件触发时,通过事件冒泡(或事件捕获)把要做的事委托给父元素来处理。</strong></p> <h2 id="三-e-target与e-currentTarget的区别">三、e.target与e.currentTarget的区别:</h2> <ul> <li>e.target 指向的是触发事件监听的对象(事件源)。</li> <li>e.currentTarget 指向添加监听事件的对象(绑定事件的dom元素)。</li> </ul> <h2 id="四-阻止冒泡与捕获">四、阻止冒泡与捕获</h2> <p><strong><span style="font-size: 18px;">为什么要阻止冒泡或捕获?</span></strong></p> <p>点击当前元素时以冒泡的方式传递事件如果上级元素绑定了同样的事件,就会因为冒泡传递导致触发。同样捕获的过程中,也会触发与当前元素绑定的相同事件的上级。只是触发顺序不同。</p> <p>事件代理一般使用的冒泡,当然阻止冒泡一般不会影响事件代理,因为顺序问题只会影响捕获事件,这也是为什么都使用冒泡实现事件代理机制。</p> <p><strong><span style="font-size: 18px;">阻止冒泡或捕获的方法</span></strong></p> <p>这里我不考虑兼容性问题,我相信不久将来兼容性可以得到解决。</p> <p>阻止冒泡w3c推介的方法是event.stopPropagation(),顾名思义停止传播,他是事件对象(event)的方法,此方法是<code>阻止目标元素的继续冒泡(或捕获)

event.stopPropagation()阻止冒泡:

    <div>
        这是div1
        <div>
            这是div2
            <div>这是div3</div>
        </div>
    </div>
    <script>
        let div1 = document.getElementById(&#39;div1&#39;);
        let div2 = document.getElementById(&#39;div2&#39;);
        let div3 = document.getElementById(&#39;div3&#39;);
        div1.onclick = function (e) {
           alert(&#39;div1&#39;);
        }
        div2.onclick = function (e) {
           e.stopPropagation();
            alert(&#39;div2&#39;);
        }
        div3.onclick = function (e) {
           alert(&#39;div3&#39;);
        }
    </script>
ログイン後にコピー

上面代码默认都是冒泡事件,我们点击div3会依次弹出’div3’与’div2’,为什么没有弹出’div1’这是因为e.stopPropagation();阻止了目标元素的事件继续冒泡到上级。如果每个点击事件都加上了e.topPropagation就不会出现多弹窗的情况。

event.stopPropagation()阻止捕获:

    <div>
        这是div1
        <div>
            这是div2
            <div>这是div3</div>
        </div>
    </div>
    <script>
        let div1 = document.getElementById(&#39;div1&#39;);
        let div2 = document.getElementById(&#39;div2&#39;);
        let div3 = document.getElementById(&#39;div3&#39;);
        div1.addEventListener(&#39;click&#39;,function(e){
           	console.log(&#39;div1&#39;);
        },true);
        div2.addEventListener(&#39;click&#39;,function(e){
            console.log(&#39;div2&#39;);
            e.stopPropagation();
        },true);
        div3.addEventListener(&#39;click&#39;,function(e){
            console.log(&#39;div3&#39;);
        },true);
    </script>
ログイン後にコピー

当我们点击div2会依次弹出’div1’与’div2’,这也是因为在div2事件中我们设置了e.stopPropagation(),阻塞了目标元素的事件继续向下捕获。

event.target == event.currentTarget:

div.addEventListener('click',function(e){
	if(event.target == event.currentTarget){
        //需要执行的代码
    }
});
ログイン後にコピー

此方法不过多解释用的不多,如果你理解了上面的内容,这个方法也能理解。

五、补充:为什么要使用addEventListener()

从上面代码不难看出addEventListener()有如下的优点(以下是MDN的原话):

addEventListener() 是 W3C DOM 规范中提供的注册事件监听器的方法。它的优点包括:

  • 它允许给一个事件注册多个监听器。 特别是在使用AJAX库,JavaScript模块,或其他需要第三方库/插件的代码。
  • 它提供了一种更精细的手段控制 listener 的触发阶段。(即可以选择捕获或者冒泡)。
  • 它对任何 DOM 元素都是有效的,而不仅仅只对 HTML 元素有效。

六、取消默认事件

event.preventDefault()

默认事件指的是<a href=""></a><input type="submit"> 标签这类有默认行为的标签,通过点击可以跳转或提交。我们给这类标签绑定一个点击事件,设置事件对象的preventDefault()方法就可以阻止默认事件的发生。

   <a>点击跳转</a>
    <script>
        let a = document.querySelector(&#39;a&#39;);
        addEventListener(&#39;click&#39;,function(e){
            e.preventDefault();
        })
    </script>
ログイン後にコピー

那么我们如何才能知道一个标签是否有默认事件,打印事件对象的cancelable属性,通过事件执行就可以知道e.cancelable的结果,如果为false表示有默认事件,true则没有。

return false;

事件执行函数中设置return false取消默认事件,但此方法不常用。

【相关推荐: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)

イベントのバブリング メカニズムを理解する: 子要素をクリックすると親要素のイベントに影響を与えるのはなぜですか? イベントのバブリング メカニズムを理解する: 子要素をクリックすると親要素のイベントに影響を与えるのはなぜですか? Jan 13, 2024 pm 02:55 PM

イベントバブリングについて: 子要素をクリックすると親要素のイベントがトリガーされるのはなぜですか?イベントバブリングとは、入れ子になった要素構造において、子要素がイベントをトリガーすると、そのイベントがバブリングのように層ごとに親要素の層に最外層の親要素まで渡されることを意味します。このメカニズムにより、子要素のイベントが要素ツリー全体に伝播され、関連するすべての要素が順番にトリガーされます。イベントバブリングをより深く理解するために、具体的なコード例を見てみましょう。 HTML コード: <divid="parent&q"

イベントのバブリングが 2 回トリガーされるのはなぜですか? イベントのバブリングが 2 回トリガーされるのはなぜですか? Feb 22, 2024 am 09:06 AM

イベントのバブリングが 2 回トリガーされるのはなぜですか?イベント バブリング (イベント バブリング) とは、DOM において、要素がイベント (クリック イベントなど) をトリガーすると、イベントがその要素から親要素にバブルアップし、最後に最上位のドキュメント オブジェクトにバブルアップすることを意味します。イベント バブリングは DOM イベント モデルの一部であり、これにより開発者はイベント リスナーを親要素にバインドできるため、子要素がイベントをトリガーすると、バブリング メカニズムを通じてイベントをキャプチャして処理できます。ただし、開発者は、バブルして 2 回トリガーされるイベントに遭遇することがあります。

jQuery .val() が失敗する理由と解決策 jQuery .val() が失敗する理由と解決策 Feb 20, 2024 am 09:06 AM

タイトル: jQuery.val() が失敗する理由と解決策 フロントエンド開発では DOM 要素の操作に jQuery がよく使われますが、フォーム要素の値の取得や設定には .val() メソッドが広く使われています。ただし、.val() メソッドが失敗し、フォーム要素の値を正しく取得または設定できない状況が発生することがあります。この記事では、.val() エラーの原因を調査し、対応する解決策を提供し、具体的なコード例を添付します。 1.原因分析.val()メソッド

jsのクリックイベントが繰り返し実行できない理由 jsのクリックイベントが繰り返し実行できない理由 May 07, 2024 pm 06:36 PM

JavaScript のクリック イベントは、イベント バブリング メカニズムのため、繰り返し実行できません。この問題を解決するには、次の措置を講じることができます。 イベント キャプチャを使用する: イベントがバブルアップする前に起動するイベント リスナーを指定します。イベントの引き継ぎ: イベントのバブリングを停止するには、event.stopPropagation() を使用します。タイマーを使用します。しばらくしてからイベント リスナーを再度トリガーします。

vue のイベント修飾子はどのようなシナリオに使用できますか? vue のイベント修飾子はどのようなシナリオに使用できますか? May 09, 2024 pm 02:33 PM

Vue.js イベント修飾子は、次のような特定の動作を追加するために使用されます。 デフォルト動作の防止 (.prevent) イベント バブリングの停止 (.stop) ワンタイム イベント (.once) イベントのキャプチャ (.capture) パッシブ イベント リスニング (.passive) アダプティブ修飾子 (.self)キー修飾子 (.key)

イベント バブリング メカニズムが 2 回トリガーされるのはなぜですか? イベント バブリング メカニズムが 2 回トリガーされるのはなぜですか? Feb 25, 2024 am 09:24 AM

イベントのバブリングが 2 回連続して発生するのはなぜですか?イベント バブリングは Web 開発における重要な概念であり、ネストされた HTML 要素でイベントがトリガーされると、イベントが最も内側の要素から最も外側の要素までバブルアップすることを意味します。このプロセスは時々混乱を引き起こす可能性があり、よくある問題の 1 つは、イベントのバブリングが 2 回続けて発生することです。イベント バブリングが 2 回連続して発生する理由をよりよく理解するために、まずコード例を見てみましょう。

バブルアップしない JS イベントはどれですか? バブルアップしない JS イベントはどれですか? Feb 19, 2024 pm 09:56 PM

JS イベントでバブルが発生しない状況にはどのようなものがありますか?イベントバブリング(Event Bubble)とは、要素上でイベントが発生した後、最も内側の要素から最外側の要素に向かってDOMツリーに沿って上方向にイベントが送信されることを意味し、この送信方法をイベントバブリングと呼びます。ただし、すべてのイベントがバブル化できるわけではなく、イベントがバブル化しない特殊なケースもいくつかあります。この記事では、JavaScript でイベントがバブルアップしない状況を紹介します。 1. stopPropagati を使用する

イベントバブリングとは何ですか?イベントバブリングメカニズムの詳細な分析 イベントバブリングとは何ですか?イベントバブリングメカニズムの詳細な分析 Feb 20, 2024 pm 05:27 PM

イベントバブリングとは何ですか?イベント バブリング メカニズムの詳細な分析 イベント バブリングは Web 開発における重要な概念であり、ページ上でイベントを配信する方法を定義します。要素上のイベントがトリガーされると、イベントは最も内側の要素から送信され、最も外側の要素に渡されるまで外側に渡されます。この配信方法は水の中で泡が泡立っているようなものなので、イベントバブリングと呼ばれます。この記事では、イベントのバブリングのメカニズムを詳しく分析します。イベントバブリングの原理は、簡単な例を通して理解できます。 H があるとします。

See all articles