• 締切済み

jQueryのmouseenterについて

jQueryで、#div1 にmouseenter,mouseleaveを設定していますが、#div1の領域の一部に重なって表示している別の要素(#div1の子要素ではない)があり、その上にマウスが乗るとmouseleaveが発動します。 これを、発動しないようにする方法はあるでしょうか?

  • sr-ki
  • お礼率68% (43/63)

みんなの回答

  • fujillin
  • ベストアンサー率61% (1594/2576)
回答No.1

>div1の領域の一部に重なって表示している別の要素 重なっている要素のうちの、ある部分ではイベントと判断し、別の部分ではそうでないという意味でしょうか? 一番簡単なのは、目的に合うようにHTMLの構成を調整してしまうことだと言えますが、そういうわけにも行かないのでしょうから… 方法はいろいろあろうかと思いますが、目的のイベント処理の前にイベントをフィルタリングする関数を作ってあげればよろしいかと思います。 jQueryのmouseenterやmouseleaveも内部で同様のことを行なっているはずで、mouseoverやmosuoutを監視してこれをmouseenterやmouseleaveに判断し直してイベントを発生させているはずです。 ただし、ご質問のケースでは上にある一つの要素内をマウスが移動していても対象範囲内の場合と対象範囲外の場合があって、その場合にイベント処理を使い分けたいのでしょうから、通常のmouseoverやmosuoutの監視だけではうまくいかないでしょう。 よくわかってませんが、想像するところ、#div1のエリア内にマウスがあるか/ないかで判定すれば、ご質問の内容に合うのではないでしょうか。 マウスイベントはバブリングするので、両方の上位要素でまとめて処理を行なっても良いですし、要素が#div1と重なる要素の2つだけに限定できるのなら、重なっている要素内にマウスがある間だけマウスの位置を監視するようにしておいてもよろしいかと思います。 もっと広げて、最上位のdocument要素で常時マウス位置を監視して、document上の対象エリアにあるかないかでイベントの発生を判断するといった考え方もできると思いますが、常時監視の場合、処理がいつも動作する関係から、なるべく負荷のかからない記述にしておく必要がありそうに思います。 その意味からは、特定した要素内にマウスがあるときだけ監視するほうが良いかもしれません。 具体的な監視方法としては、mousemoveなどでマウスの位置と対象要素を監視して、対象エリアに入る/出るが発生した時に、目的の処理(=もとからのイベント処理)に処理を渡すような、フィルタリング関数を作成しておくといった感じです。 ・・・と、ここまで書いて思いついたのは、 ある範囲へのマウスの出入りを監視すれば良いだけでしたら、一番上に重ねて範囲のみのdivを表示しておき、そのdivに対してmouseover/outを設定しておくという方法でも目的を達せられそうに思います。

関連するQ&A

  • jQueryに関しての質問です。

    jQueryに関しての質問です。 .bind("mouseenter"or"mouseleave"を使って画像をスライドアップ・ダウンさせたいのですが、 mouseenterとmouseleaveを高速で繰り返すと、マウスの動きを止めても、繰り返した回数分スライドアップ・ダウンが実行されてしまいます。 いろいろ考えたのですが、うまくいきませんでした。 是非、回避・改善方法をご教授下さい。 お願いいたします。

  • jQueryでポップアップの中にポップアップ

    <html> <head></head> <style type="text/css"> .popup { position:absolute;bottom:0;left:0;width:300px;padding:1px 5px;border:solid 1px #000;background:#fff;} </style> <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.6/jquery.min.js"></script> <script type="text/javascript"> $(function(){ $('.b').live({ /* <= bind? */ mouseenter:function(){ var target = $( $(this).children().filter('.c').attr('href') ); $(this).css('position','relative'); $(this).append('<div class="popup">'+target.html()+'</div>'); }, mouseleave:function(){ $(this).css('position','static'); $(this).children().filter('div').remove(); } }); }); </script> <body> <div id="a1"><p>a1a1a1</p></div> <div id="a2"><p>a2a2<span class="b"><a href="#a1" class="c">#a1</a></span>a2</p></div> <div id="a3"><p>a3<span class="b"><a href="#a2" class="c">#a2</a></span>a3a3</p></div> </body> </html> このような感じで、#a2にマウスカーソルを合わせたらid="a2"の内容が吹き出しのような感じでポップアップし、 その中に含まれる#a1にマウスカーソルを合わせたらそこからさらにid="a1の内容がポップアップする仕組みを作りたいのですが、 ポップアップの上にマウスカーソルを合わせることができずに困っています。 参考:jQuery の hover() について調べたことのまとめ http://d.hatena.ne.jp/tilfin/20080615/1213608859 参考:.live()でhoverイベントに複数の関数をバインドできない http://jsdo.it/cancer6/mh9t 自分で調べてみて分かったことは ・hover(fn1,fn2)はfn1=mouseover,fn2=mouseoutではなくfn1=mouseenter,fn2=mouseleave ・後から追加した要素(ポップアップ)の中の要素にもhoverを有効にするにliveでhoverを設定する必要がある ・liveでhoverイベントを指定するときはmouseenter,mouseleaveの2つに分けて指定する必要がある 上記のコードを保存して見ていただけると分かると思うのですが、 liveにするとポップアップの上にカーソルを合わせることができず、 bindにするとポップアップの上にカーソルを合わせることができます。 ポップアップはclass="b"の子要素となるようにしているので、 ポップアップにマウスカーソルが合わさっている状態=class="b"からmouseleaveしてない状態となっていると思うのですが…。 どのようにすれば「後から追加された要素(ポップアップ)」内にもhoverイベントを適用させつつ、 「後から追加された要素(ポップアップ)」内にマウスカーソルを乗せられる状態にできますか? よろしくお願い致します。

  • jQuery|:not(:animated)

    こんにちは、 jQueryにおいて、要素に対して.hoverをかけ、:not(:animated)の指定をした場合、対象要素上で素早くマウスを滑らせると、アニメーションが終了する前にmouseleaveしてしまい、mouseenterの状態でアニメーションが止まってしまいます。(下記URL参照) http://ref.andwax.com/Untitled-1.html このように棚に並べたパンすべてに同様の処理を行う予定なのですが、前述の不具合が解消できなければアイディアそのものを変更を迫られることになると思われます。何か対処方法をご存じでしたら、お伺いできませんでしょうか。全く違う方法で同様の処理を行うアイディアをご存じでしたら、そちらもお聞かせいただけるとありがたいです。 また、area要素にはcursorプロパティが効かないようなのですが、カーソルを出現させるためのアイディアがありましたら、伺わせてください。

  • jQueryで<body>要素にマウスが乗ったらイベントを起こすものを

    jQueryで<body>要素にマウスが乗ったらイベントを起こすものを作りたいのですが中身のタグにもイベントを設定すると影響はありますでしょうか? 例えばBODYに触れたら動作が起きるようにします。 もちろんその中にさらに<div>などの要素がありそこにもなんらかのイベントを付与したとします。 そういった場合、動きがおかしくなる可能性はありますか? そういった設定でも特に問題ないでしょうか?

  • jQueryのclickについて

    現在仕事でjQueryを使用して、要素の表示非表示を行うイベントを作成しているのですが、一つ難題がありまして・・・まず下記に簡単に文法を記述しましたのでご覧下さいませ・・・ 『html』 <ul> <li>ボタン1</li> <li>ボタン2</li> <li>ボタン3</li> </ul> <div class="area"><!-- 要素 --></div> <div class="area"><!-- 要素 --></div> <div class="area"><!-- 要素 --></div> 『jQuery』 j$("li").click(function(){ var btnNum = j$("li").index(this); j$(".area").hide(""); j$(".area").eq(btnNum).show(""); }); 上記にしたときに例えば”ボタン1”を押した時に再度”ボタン1”をおすとここでいう一番目の”area”を消去したいのですが、 toggleを使用すると”ボタン1”を押した時に”ボタン2”を押すと再び”ボタン1”を押すと、消去してからの動作をするため二度クリックしないと”area”が表示されません… そこでtoggleの様な動作で、同じボタンを二度押すと対象の要素が消去されるようないい方法ありませんでしょうか? 折角jQueryを使用しているのでスリムな記述がしたいんですよね・・・ 宜しくお願いします。

  • jQueryのmouseoutについての質問です。

    jQueryの質問です。 dtにマウスを合わせた時にddが表示し、dlの領域以外にマウスが外れるとdd が非表示させるような設定をしたいのですがうまくいきません。 子要素のddとかdtとかaに合わさるとすぐに非表示になってしまいます。 dl内は、どこを移動しても非表示にならずdl要素以外の箇所にマウスが合わ さった時に非表示になってほしいのですが どなたかアドバイスいただけないでしょうか? 自分なりにはこのように記述してみました。 ■jQueryの記述 $(function(){ $("dt").mouseover(function(){ $("dd:not(:animated)").slideDown("slow"); }); $("dl").mouseout(function(){ $("dd:not(:animated)").slideUp("slow"); }); }); ■CSSの記述 <dl> <dt>スライドして表示状態を切り替える</dt> <dd> あああ<a href="#">ああああ</a>あああああああ ああああああああああああああああああああああああああああああああああ あああああああああああああ<a href="#">ああああ</a>あああああ<a href="#">ああ</a>あああああ </dd> </dl> デモURL: http://tegarude.web.fc2.com/faq/test.html

  • jQuery 1つの要素を複数箇所に表示したい

    いつもこちらでお世話になっています。 jQuery初心者です。 また、お知恵を拝借したく、お願いします。 以下のようなHTMLがあります。 やりたい事は <div class="info">の中の要素全て(ul以下)を <div class="hoge">の中にも表示したいのです。 ですが、以下のスクリプトのように書くと、 今度は、<div class="info">の中の要素が表示されなくなり、 <div class="hoge">の中に表示されました。 <div class="info">の中の要素は 表示のままで、重複して<div class="hoge">の中に 表示させる方法ってありますか? ▼HTML ------------------- <div class="hoge"></div> ~別要素(省略)~ <div class="info">  <ul>   <li>項目1</li>   <li>項目2</li>  </ul> </div> ▼Script ------------------- var contents = $("div.info ul"); $("div.hoge").html(contents); ------------------- 多分、基本的な事なのかもですが、 1つの要素を重複して表示できる方法がありましたら 詳しい方、ご教授ください。 どうぞ宜しくお願いいたします。

    • ベストアンサー
    • AJAX
  • jQueryスライドショーの設定

    http://slidesjs.com/ Slides, A Slideshow Plugin for jQuery ここのjqueryを使って、左右の矢印(← →)をクリックすると div要素が順番に入れ替わっていくというものを導入しました。 そこで、例えばdivが3つあったとして、 1が表示されているときに→を押すと、当然2に行きますが 3が表示されているときに→を押すと、スクロール自体は右にスクロールしているのに 1が表示されてループしてしまいます。 そこで、3が表示されているときは、→をクリックしても1に行かない、 そもそも→はクリックできず、←しかクリックできない状態にしたいのです。 矢印は消えなくていいです。 うまくストップさせることはできないでしょうか

  • jQueryで追加した要素がマウスホバーに反応しない

    jQueryを使って、ボタンを押すと要素を追加しています。 後から追加された要素はマウスホバーなどが有効にならないのですが、 対象方法などあるでしょうか。 下記のようなソースで質問の状態になります。 よろしくお願いします。 <html> <head> <title>test</title> <script type="text/javascript" src="system/jquery-1.3.2.min.js"></script> <script type="text/javascript"> <!-- jQuery(document).ready(function($){ jQuery(".edit").hover( function () { jQuery(this).css("background","yellow"); }, function () { jQuery(this).css("background","none"); } ); jQuery(".insert").click(function () { var html = "<div class='edit'><p>add-text</p></div>"; jQuery("#sortable .edit:first").before(html); }); }); // --> </script> </head> <body> <div><INPUT class="insert" type="button" value=INSERT></DIV> <div id="sortable" style="width:200px;"> <div class="edit"> <p>text1</p> </div> <div class="edit"> <p>text2</p> </div> <div class="edit"> <p>text3</p> </div> </div><!-- id="sortable" --> </body> </html>

  • Jqueryについて困っております><

    はじめまして jqueryに触れる事が初めてなのですが、緊急にクライアントの要望に応える形になり困っております… 1つめは、gifアニメ風にマウスをあてると絵が動くという物なのですが、それが1ページ内に動かしたい対象が複数ある場合の設定方法です。 >>http://suzken.com/2010/10/jquery-img-anime.html こちらの方のHPで動かし方がありましたが、この複数のやり方が分かりません。 2つ目は、上記gifアニメ風のアイコンにマウスカーソルをあてた時に動きを見せる+吹き出しの様なメニューが表示され、1文字ずつテキスト表示させたい。です。 吹き出しの様な物を表示させる事と、文字を出すことはできたのですが、マウスオーバーした瞬間に1文字表示が始まってしまい、マウスを離しても文字だけが画面上に残ってしまいます。 色々調べながら調整してはいるのですが、中々うまくいかず… 何か解決策がありましたら、お手数ではありますが何卒お力をお貸しいただきたいです><

専門家に質問してみよう