
初期状態:aaaという文字のみ表示
動作:aaaをクリックするとその下にbbb,cccというリンクが現れ、これら(aaa,bbb,cccの領域)からマウスアウトしたら、bbb,cccが消える
というものを作る為に、以下のコードを書いてみました。
<div onMouseout="this.childNodes[1].style.display='none'"><p onClick="this.parentNode.childNodes[1].style.display='block'">aaa</p><ul style="display:none;"><li><a href="#">bbb</a></li><li><a href="#">ccc</a></li></ul></div>
「ブラウザによりノードのカウント方法が異なり挙動が変わる」のを防ぐために改行をなくしましたが、見やすくするとこうなります↓
<div onMouseout="this.childNodes[1].style.display='none'">
<p onClick="this.parentNode.childNodes[1].style.display='block'">aaa</p>
<ul style="display:none;">
<li><a href="#">bbb</a></li>
<li><a href="#">ccc</a></li>
</ul>
</div>
これを実際に試してみると、aaaを押してリンクbbb,cccが出てきたのは良いものの、
リンクをクリックするためにマウスをbbb,cccへ移動しようとすると、
aaaから離れた時点でbbb,cccが消えてしまいます。
「div全体に」”マウスアウトしたらbbb,cccが消える”というつもりで上記のソースを書いたのですが、
divのonMouseoutはpからマウスアウトしても働いてしまうのでしょうか。
どのように修正したらよいか試行錯誤中です。
解決策があれば、どうぞよろしくお願いします。
No.1ベストアンサー
- 回答日時:
それぞれのオブジェクトにbackgroundで背面に色をつけると、なんでだめなのかわかります。
たぶん、イベントバブルを理解していないのと、on mouse out, over, enterの発生トリガーと順番が理解していなことが、理解できていないのでしょう。
下層下位があるオブジェクトではイベントトラップ(ドリブン)を設定してあるオブジェクトの境目で、発生します。それと上記のように、大きさを何も指定していないで、元の大きさを超えてのオブジェクトの動的挿入は、誤動作を起こします。
十分自分でデバックしてみてください。じゃないと動作が理解できないと思います。
なので、回答しても、またさらにそれに対して質問する方が多く(自分で理解しようとしていない)、私はここまでにします。
ヒントとしては、存在が消えてしまうDISPLAYではなくVisvi...を使うのと、out , overなどを組み合わせる事です。
発生したときにalert(this.tagName)などと発生場所を表示する、または object.innerText = object.innerText + this.idなどと、順番を記録するDIVを作って表示すれば、順番がわかります。
イベントはオブジェクトの境目、階層があるときは、上から下へ起きていますが(mouseoverなど)、実は発生場所から上へも、イベントは伝播(これをバブルと言う)します。
オブジェクトに色をつけたり、発生を書き込み事で、目に見えるようにすれば、よく理解できるようになります。
この回答への補足
ありがとうございました!
色々学習した結果、コード的には「event.cancelBubble=true」を加えるのが一番シンプルかと思いました。
ありがとうございました!
ありがとうございます!
heightを与えていなかったり、displayも原因かな?と思っていたところでした。
背景に色を塗ったり、alertで状態を確認したり、色々試してみます。
No.2
- 回答日時:
子要素で発生したイベントが親要素に伝わっていく(バブリング)からです。
p要素でのmouseoutイベントがdivにも伝播するので、そのためにdivに設定した処理が実行されています。
詳しい説明は以下を
http://vird2002.s8.xrea.com/javascript/DOM-Level …
http://wiki.bit-hive.com/tomizoo/pg/JavaScript%2 …
http://uhyohyohyo.sakura.ne.jp/javascript/3_3.html
もすこし詳しくは
http://www.ibm.com/developerworks/jp/xml/library …
http://www2u.biglobe.ne.jp/~oz-07ams/prog/xml-ev …
そのまま予定の動作にするには、onclickのイベント処理の中に、イベント発生元を調べてdiv要素以外だったら処理をしないような分岐を追加すればよろしいかと。
この回答への補足
ありがとうございました!
色々学習した結果、コード的には「event.cancelBubble=true」を加えるのが一番シンプルかと思いました。
ベストアンサーは、時系列的に、最初に下さった方にさせていただきましたが、どちらも良かったです。非常に参考になりました。
ありがとうございました!
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- HTML・CSS HTML & CSS 縦ボックス内の文字の左右センタリング 3 2023/03/25 04:23
- HTML・CSS アコーディオンメニューが思うように動作しません。 1 2023/08/20 16:48
- Excel(エクセル) ¥マークを含むパスの処理について(マクロ、または関数) 2 2022/12/25 02:11
- PHP style.cssのjQuery条件付きcssが機能しない 4 2022/07/17 18:27
- HTML・CSS CSS のみのタブ切り替えについて 1 2023/01/11 16:47
- HTML・CSS テキストを画面の真ん中に配置したいです。 2 2022/11/25 16:11
- HTML・CSS 書籍を見つつサイト造りの練習をしているのですが、見た目が一致しません 2 2022/11/28 15:00
- JavaScript 指定したパスが現URLに含まれていたら特定要素を削除するJavascriptのコードを教えてください 2 2023/04/27 17:58
- SQL Server ACCESSで3ファイルを結合して、表を作成するやり方を教えて下さい。 17 2022/08/15 20:34
- Perl perl このテキストファイルを簡単に配列に入れるには? 2 2022/04/27 20:24
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
【JQuery】アコーディオンの入...
-
jQueryのhide,showで中の要素が...
-
jqueryのsortableで一部ソート...
-
ネストされたチェックボックス...
-
jQueryでネスト構造の<li>がク...
-
タブメニューを上下に設置
-
ページの上下に同じタブメニュ...
-
多階層ドロップダウンのスマホ...
-
pythonのDjangoでHTML内で変数...
-
大量のチェックボックス状態取...
-
クリックで表示、非表示するメ...
-
タブ切り替えの初期表示について
-
JavaScriptで変更した属性の元...
-
MAX関数を使ってからLEFT JOIN...
-
[JS] あるクラス名をページから...
-
window.openで値の渡し方を教え...
-
JSPでの画像ファイル表示
-
javascriptでpostした値が取得...
-
背景色を一定時間ごとにランダ...
-
[jQuery]bxSlider 一番最後と...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
jqueryのsortableで一部ソート...
-
タブ切り替えの初期表示について
-
クリックした<a>タグのみにClas...
-
【javascript で動的に a タグ...
-
JQueryタブのアクティブ アン...
-
jQueryのhide,showで中の要素が...
-
JS <a></a>タグ内のリンク先ア...
-
javascriptで教えてください。 ...
-
ネストされたチェックボックス...
-
div要素をランダムに表示させたい
-
jquery ドロップダウンメニュー...
-
同一ページ内で、任意の文字列...
-
onMouseoutの有効な範囲
-
macromediaのようなメニュー
-
mootoolsを使ったドロップダウ...
-
tableやul,liで表示されたリス...
-
jQueryのeqで最後からn番目以降...
-
javascript, getElementsByTagN...
-
jQuery タブメニューへのダイ...
-
【jQuery】遅延実行(タイムラ...
おすすめ情報