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

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

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

for文は、様々なプログラミング言語で使われている制御構造です。for文に定義している条件から外れるまで、for文内の命令文を繰り返し実行します。

jQuery

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

Q&A

解決済

4回答

1695閲覧

jQuery for文について

may88seiji

総合スコア79

for

for文は、様々なプログラミング言語で使われている制御構造です。for文に定義している条件から外れるまで、for文内の命令文を繰り返し実行します。

jQuery

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

0グッド

1クリップ

投稿2016/07/13 10:41

編集2016/07/13 10:46

###困っていること
.btn_sec2_19にmouseover,mouseout した際に
対応する.hover1
9の画像を表示 非表示するコードをjQueryで書きました。

個別のコードでは問題なく表示できていたのですが、
下記for文にまとめたところ、なぜかすべて.btn_sec2_5の.hover5が表示 非表示されます。

for文に間違いがあれば指摘お願いします。
なければ他の要素をあたってみます。

どうぞよろしくお願いいたします。

###該当のソースコード

javascript

1 for(var i = 1; i <= 9; i++){ 2 $('.btn_sec2_'+i) 3 .on('mouseover',function(){ 4 $(".hover"+i).css({display:"block", opacity:0}) 5 .stop(true).animate({opacity:1}, 300, "easeOutQuart"); 6 }) 7 .on('mouseout',function(){ 8 $(".hover"+i).stop(true).fadeOut(); 9 }); 10 };

html

1<div class="group"> 2 <div class="btn_sec2_1"><img src="../common/img/product1.png" alt="" width="50px"><div class="hover1"><img src="../common/img/hover01.png" alt=""></div></div> 3 4 <div class="btn_sec2_2"><div class="hover2"><img src="../common/img/hover02.png" alt=""></div><img src="../common/img/product2.png" alt=""></div> 5 6 <div class="btn_sec2_3"><div class="hover3"><img src="../common/img/hover03.png" alt=""></div><img src="../common/img/product3.png" alt="" class="product3"></div> 7 8 <div class="btn_sec2_4"><div class="hover4"><img src="../common/img/hover04.png" alt=""></div><img src="../common/img/product4.png" alt=""></div> 9 10 <div class="btn_sec2_5"><div class="hover5"><img src="../common/img/hover05.png" alt=""></div><img src="../common/img/product5.png" alt=""></div> 11 12 <div class="btn_sec2_6"><div class="hover6"><img src="../common/img/hover06.png" alt=""></div><img src="../common/img/product6.png" alt=""></div> 13 14 <div class="btn_sec2_7"><div class="hover7"><img src="../common/img/hover07.png" alt=""></div><img src="../common/img/product7.png" alt=""></div> 15 16 <div class="btn_sec2_8"><div class="hover8"><img src="../common/img/hover08.png" alt=""></div><img src="../common/img/product8.png" alt=""></div> 17 18 <div class="btn_sec2_9"><div class="hover9"><img src="../common/img/hover09.png" alt=""></div><img src="../common/img/product9.png" alt=""></div></div>

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2016/07/13 10:43

htmlもあわせて追記してください。
guest

回答4

0

ベストアンサー

イベント内の$(".hover"+i)はその時点でのiの値が使われます。.on()実行時のiの値ではありません。
ですので、ループが終わった時点の9が使われ.hover9が表示されるはずですが、.hover5になっているということは、変数iを別のループで使いまわしているんじゃないかな、と思います。

解決にはletを使うか、即時関数でクロージャを使うのがいいと思います。

参考:
let - JavaScript | MDN
よくある間違い: ループ内でクロージャを作成する - JavaScript | MDN

投稿2016/07/13 10:58

Lhankor_Mhy

総合スコア36074

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

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

may88seiji

2016/07/13 11:33

他のループとバッティングしてました。 原因→解決方法と大変参考になりました。
guest

0

そもそもなのですが、for でループを書く必要がありません。

html

1<!DOCTYPE HTML> 2<html lang="ja"> 3 <head> 4 <meta charset="UTF-8"> 5 <title></title> 6 </head> 7 <body> 8 <div class="group"> 9 <div class="btn_sec"> 10 <img src="../common/img/product1.png" alt="" width="50px"> 11 <div class="hover"> 12 <img src="../common/img/hover01.png" alt=""> 13 </div> 14 </div> 15 <div class="btn_sec"> 16 <img src="../common/img/product2.png" alt="" width="50px"> 17 <div class="hover"> 18 <img src="../common/img/hover02.png" alt=""> 19 </div> 20 </div> 21 <div class="btn_sec"> 22 <img src="../common/img/product3.png" alt="" width="50px"> 23 <div class="hover"> 24 <img src="../common/img/hover03.png" alt=""> 25 </div> 26 </div> 27 </div> 28 <script src="jQuery-2.1.4.min.js"></script> 29 <script type="text/javascript"> 30 $(function () { 31 $('.btn_sec').on('mouseover', function () { 32 $(this).find(".hover").css({display: "block", opacity: 0}) 33 .stop(true) 34 .animate({opacity: 1}, 300, "easeOutQuart"); 35 }).on('mouseout', function () { 36 $(this).find(".hover").stop(true).fadeOut(); 37 }); 38 }); 39 </script> 40 </body> 41</html>

投稿2016/07/13 10:50

編集2016/07/13 10:53
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

may88seiji

2016/07/13 11:45

this の使い方、大変勉強になりました。 ありがとうございます。
guest

0

javascript

1for(let i = 1; i <= 9; i++){

具体的な対応としてはこれに書き換えてブロックスコープを利用するべし

理屈はLhankor_Mhyさんがすでに書いているので省略します

投稿2016/07/13 11:46

oskbt

総合スコア1895

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

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

0

Kosuke_Shibuyaさんの書いているようにforは不要ですが、i が無性に使いたいならこういうふうにも書けると思います。

JavaScript

1$.each( ( new Array( 9 ) ), function( i ) { 2 i += 1; 3 $( '.btn_sec2_' + i ).on( 'mouseover', function() { 4 $( '.hover' + i ).css( { display: 'block', opacity: 0 } ).stop( true ).animate( { opacity: 1 }, 300, 'easeOutQuart' ); 5 } ).on( 'mouseout', function() { 6 $( '.hover' + i ).stop( true ).fadeOut(); 7 }); 8} );

投稿2016/07/13 11:16

kei344

総合スコア69398

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

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

may88seiji

2016/07/13 11:43

ありがとうございます。 引き出しが少ないので、参考になります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問