質問: JavaScript初学者です。jqueryを使って「メニューをhoverするとhoverした要素の下に隠れている中のメニューが表示され、メニューから離れると表示された中のメニューが非表示されるプログラムを作る」という課題がある(htmlで指定されているクラスは削除や追加などの編集禁止)のですが、その答えのコードを見てもいまいち理解ができなかったのでjqueryのコードの部分について2つ質問させてください。 1.要素の指定は $(".menu__list").children()となっているのですが、メニューバーの"Animal"と"Plant"の「どちら」にホバーしたか、というのはどの部分で判断しているのでしょうか。$(".menu__list").children()の指定だとクラス名に".menu__list"がついているulタグの全ての子要素、つまりliタグの要素をとってくるということになるので明示的にどっちの要素か表していないのにちゃんと判断して動いているのが不思議でたまりません。 2."stop()"はなぜ"slideDown()"と"slideUp()"の前でないと動作しないのでしょうか。 わかりにくい文章で申し訳ありませんが、本当に悩んでいるのでご教示くださるととても嬉しいです。 ``` $(function(){ $(".menu__list").children().hover(function(){ $(this).children().next().stop().slideDown(); } ,function(){ $(this).children().next().stop().slideUp(); } )} ); ``` ``` jQuery Animal Lion Zebra Elephant Rhino Plant Cedar Olive Aloe ```
回答: 1.については、hover()した対象がthisに入っています。 ですので`$(this)`と書けば、最初の要素にhoverしたなら最初のli要素、二番目の要素にhoverしたなら二番目のli要素がthisになるので、特に条件分岐を書かなくても動くというわけです。 2.についてはstop()は動作中のアニメーションをストップさせるというものなので、 ソースコードでは、ホバーしてスライドダウンしているときにマウスを離すと、 スライドダウンのアニメーションをストップしてからスライドアップのアニメーションを開始するという処理になっています。 それが、`$(this).children().next().slideUp().stop()`とストップとスライドアップの順番を逆にしてしまうと、スライドアップの処理を開始すると同時にそのアニメーションをストップするという処理になり、結果スライドアップのアニメーションが始まらないという結果になります。