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

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

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

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

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

Q&A

解決済

2回答

711閲覧

メニューに利用しているSlideToggleの多重登録を防ぎたいです

Euri_K

総合スコア32

JavaScript

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

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

0グッド

0クリップ

投稿2019/06/04 01:52

やりたいこと

メニューにマウスカーソルが乗ると
slidetoggleでメニューが下に伸びるものを作ったのですが、
カーソルが手ブレでメニューに乗ったり乗らなかったりすることで
イベントが多重に登録され延々伸び縮みするのを防ぎたいです。
現状は下記の内容で動作しています。

$(function(){ $('.sita').hover(function(){ $(this).children('div').slideToggle(); },function(){ $(this).children('div').slideToggle(); }); });

状況・要件としては

1:一度メニューが伸びて、カーソルが離れて縮んで消えるという動作が終わるまでは、このイベントが多重に動いてほしくない

2:とはいえ、このスクリプトで動くメニューボタンは複数あり、ボタン1のメニューが伸び縮みしている間はボタン2のメニューが動かない、では問題がある

という状況です。

2:については一個一個クラスを変えればなんとでもなるので優先順位は低いのですが、
1:についてはどうにかしなければならない状況になっています。

詳しい方、どなたかご教授お願いいたします。

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

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

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

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

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

yambejp

2019/06/04 03:17

HTMLを提示ください
Euri_K

2019/06/04 03:47

<div id="gnavi"> <ul> <li id="link01" class="sita"><a href="~~">メニュー1</a><div> <table width="100%" border="0" cellspacing="0" cellpadding="5"> <tr> <td bgcolor="#FBFBFB" align="center"><strong><a href="~~">小メニュー1</a></strong></td> </tr> <tr> <td bgcolor="#FBFBFB" align="center"><strong><a href="~~">小メニュー2</a></strong></td> </tr> </table> </div></li> <li id="link02" class="sita02"><a href="~~">メニュー2</a><div> <table width="100%" border="0" cellspacing="0" cellpadding="5"> <tr> <td bgcolor="#FBFBFB" align="center"><strong><a href="~~">小メニュー1</a></strong></td> </tr> <tr> <td bgcolor="#FBFBFB" align="center"><strong><a href="~~">小メニュー2</a></strong></td> </tr> <tr> <td bgcolor="#FBFBFB" align="center"><strong><a href="~~">小メニュー3</a></strong></td> </tr> </table> </div></li> <li id="link03"><a href="~~">メニュー3</a></li> <li id="link04"><a href="~~">メニュー4</a></li> <li id="link05"><a href="~~">メニュー5</a></li> </ul> </div> このような感じで、ナビゲーションの特定のボタンだけ更にナビゲーションが用意されている構造です。 いろいろ考えたのですが、これ以上要件をややこしくしても仕方ないので上記の「2:」はクラス自体をサブメニューの数だけ増やして対応することにしました。
yambejp

2019/06/04 03:50 編集

2番目のliはclass="sita02"ではなくclass="sita"ですか? いずれにしても私の回答で解決しませんか?
Euri_K

2019/06/04 03:57

コードが冗長になるとは思いますが、クラスを同じにすることで変な巻き込みが発生するとややこしくなるので、一旦クラスを分け同じ挙動のスクリプトを2つ書くことにしました。要件に書きました「2:」についてはこれで回避できますので、「1:」についてのみアドバイスいただければ幸いです。
yambejp

2019/06/04 03:59 編集

よく状況がわからないのですが私の回答が「1:」の回避を実現していませんか?
Euri_K

2019/06/04 04:37

すみません、投稿が前後して申し訳ないです。ご提示ありがとうございます。 頂いたコードも試してみたのですが、多重にイベントが発生する状況になると、カーソルが離れていても2回目のslidedownまでは発生し、そこで動作が一旦ストップします。再度カーソルを載せて離すとslideupが発生してメニューが消えるのですが、jqueryだとやはり処理の中断などのあまり細かい挙動には向いていないのでしょうか…。
guest

回答2

0

ベストアンサー

slideToggleなどの、animate関連の処理を中断させる、
stopメソッドを使うと、イベントの二重実行を防ぐことができます。

jQuery

1$(function(){ 2 3$('.sita').hover(function(){ 4 $(this).children('div').stop().slideToggle(); 5},function(){ 6 $(this).children('div').stop().slideToggle(); 7}); 8 9});

投稿2019/06/04 04:47

編集2019/06/04 04:51
miyabi_takatsuk

総合スコア9528

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

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

Euri_K

2019/06/04 05:58

回答ありがとうございます。どうやらお客様的にはこちらの動作がしっくり来るようで、これでOKをいただきました。 完全に変わった要件でもなんでもなく私の初歩的な知識不足で申し訳ないです。
miyabi_takatsuk

2019/06/04 06:04 編集

解決されて何よりです。 謝ることはないとないです。 私も、同じ現象に悩んだ時があったので、その経験を生かすことができてうれしいです。 今回は、実際にはイベントが二重登録されているわけではない状態ですが、 他にも、本当に、イベントが二重登録されて二回以上実行されるパターンがあったりするので、バグが出た時に、可能性の一つとして、頭に入れておくと、対応しやすくなると思います。 (質問の要件ではないので、ここまでにしておきます)
guest

0

例えばこんな感じ?

javascript

1<script> 2$(function(){ 3 $('.sita div').hide(); 4 $('.sita').hover(function(){ 5 if($(this).find('div').is(':not(:visible)')){ 6 $(this).children('div').slideDown(); 7 } 8 },function(){ 9 $(this).children('div').slideUp(); 10 }); 11}); 12</script> 13<div class="sita"> 14<span>1</span> 15<div>1-1</div> 16<div>1-2</div> 17<div>1-3</div> 18</div> 19<div class="sita"> 20<span>2</span> 21<div>2-1</div> 22<div>2-2</div> 23<div>2-3</div> 24</div> 25<div class="sita"> 26<span>3</span> 27<div>3-1</div> 28<div>3-2</div> 29<div>3-3</div> 30</div>

投稿2019/06/04 03:34

yambejp

総合スコア114843

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

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

Euri_K

2019/06/04 05:57

挙動としては、別で投稿頂いたmiyabi_takatsukさんのものがお客様の要望に近かったようです。 私の初歩的な知識不足で申し訳ないです。 いろいろとご提示いただいてありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問