下記ソースは、pのイベントを監視しています。
html
1<div id="superParent"> 2<p id="parent"><span id="child">あいうえお(false/バブリング)</span></p> 3</div> 4 5<div id="superParent2"> 6<p id="parent2"><span id="child2">あいうえお2(true/キャプチャ)</span></p> 7</div> 8 9<script type="text/javascript"> 10var p = document.getElementById("parent"); 11var p2 = document.getElementById("parent2"); 12 13//イベントバブリング mouseenter、mouseleaveは、バブリングしないが、mouseover、mouseoutは、バブリングする。 14p.addEventListener("mouseover", function(e) { 15test(e) 16},false); 17//イベントキャプチャ 18p2.addEventListener("mouseenter", function(e) { 19test(e) 20},true); 21 22function test(e) { 23 var t=e.target 24 if(t.nodeName=="SPAN") { 25 console.log("イベントの流れの段階",e.eventPhase+"イベント発生元要素"+t+"★"+t.nodeName+":"+e.type); 26 } 27 if(t.nodeName=="P") { 28 console.log("イベントの流れの段階",e.eventPhase+"イベント発生元要素"+t+"★"+t.nodeName+":"+e.type); 29 } 30 if(t.nodeName=="DIV") { 31 console.log("イベントの流れの段階",e.eventPhase+"イベント発生元要素"+t+"★"+t.nodeName+":"+e.type); 32 } 33} 34</script>
イベントキャプチャなので、最上位ノード(window)からイベント発生元まで伝播します。
変数p2でイベントが発生すればコンソール画面には、
イベントの流れの段階 2イベント発生元要素[object HTMLParagraphElement]★P:mouseenter
と表示されます。
spanでイベントが発生すれば
イベントの流れの段階 2イベント発生元要素[object HTMLParagraphElement]★P:mouseenter
イベントの流れの段階 1イベント発生元要素[object HTMLSpanElement]★SPAN:mouseenter
と表示されます。
ここで二つ質問があります。
1.
spanでイベントが発生した際、イベントキャプチャなので、最上位ノードからp、spanと伝播しましたが、
コンソール画面には、pとspanしか表示されておりません。
pとspanが表示されたのに、pの親要素であるdivが表示されていない理由は、何なのでしょうか。
上から伝播されてくるのであれば、divが表示されても良いような気がするのですが。
なぜ、divが表示されないのか調べていたとき、getElementByIdのメソッドを「parent2」から「superParent2」に変えたところ
イベントの流れの段階 2イベント発生元要素[object HTMLDivElement]★DIV:mouseenter
イベントの流れの段階 1イベント発生元要素[object HTMLParagraphElement]★P:mouseenter
イベントの流れの段階 1イベント発生元要素[object HTMLSpanElement]★SPAN:mouseenter
と表示されました。なぜ、parent2からsuperParent2に変えたところ、質問1であったように、divが表示されるようになったのでしょうか。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/12/22 09:43 編集
2016/12/22 14:08
2016/12/26 05:44
2016/12/26 14:17
2016/12/27 10:45