質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

1回答

1793閲覧

divがイベントキャプチャされない理由

aaaaaaaa

総合スコア501

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2016/12/20 11:20

編集2016/12/27 10:45

下記ソースは、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が表示されるようになったのでしょうか。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

親要素でイベントキャプチャすれば見えます。

Re: aaaaaaaa さん

投稿2016/12/20 12:11

think49

総合スコア18162

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

aaaaaaaa

2016/12/22 09:43 編集

ご回答有難うございます。親要素というのは、 var p2 = document.getElementById("parent2"); を var p2 = document.getElementById("superParent2");に変更する、つまりpからdivに変更することで、ということでしょうか。 http://fast-uploader.com/file/7037952908695/ divがなぜかundefinedと表示されていますが、確かにdiv→p→spanの通りになりました。 しかしなぜdivのみundefinedと表示されたり、superParent2に変えると、divも表示されるようになったのでしょうか。
aaaaaaaa

2016/12/26 05:44

ご返答有難うございます。 「しかしなぜdivのみundefinedと表示されたり、superParent2に変えると、divも表示されるようになったのでしょうか」のソースは、下記となります。 http://jsdo.it/rrrrrrrr/ekVv
think49

2016/12/26 14:17

> しかしなぜdivのみundefinedと表示されたり、 t.noneName を t.nodeName に修正したら直るのではないでしょうか。 > superParent2に変えると、divも表示されるようになったのでしょうか。 変更前のコードは質問文のコードでしょうか。 div要素がイベント発生源ならば親要素から順番にイベントが伝播してdiv要素でとまりますのでp要素では捕捉できません。 以前も紹介しましたが、uhyohyo.net は分かりやすく解説しているので一通りの記事に目を通しておくことをお勧めします。 http://uhyohyo.net/javascript/3_4.html
aaaaaaaa

2016/12/27 10:45

ご回答有難うございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問