
複数のボタンがあり、それぞれがクリックされると、
対応したdiv要素がanimateを行う、というギミックを作成しております。
配列に複数のボタンのid名と、各div要素のid名を格納しておき、
for文でclickイベントを登録しようとしましたが、うまく動作しませんでした。
【例1】
jQuery(function($){
var buttonArray = ["#button0", "#button1", "#button2"];
var divArray = ["#box0", "#box1", "#box2"];
for(i=0; i<buttonArray.length; i++){
$(buttonArray[i]).click(function(){
$(divArray[i]).animate({width: "0px"}, "slow", "swing");
});
}
});
---------------------------------------------------
以下のように書くと、正常に動作しました。
【例2】
jQuery(function($){
var buttonArray = ["#button0", "#button1", "#button2"];
var divArray = ["#box0", "#box1", "#box2"];
$(buttonArray[0]).click(function(){
$(divArray[0]).animate({width: "0px"}, "slow", "swing");
});
$(buttonArray[1]).click(function(){
$(divArray[1]).animate({width: "0px"}, "slow", "swing");
});
$(buttonArray[2]).click(function(){
$(divArray[2]).animate({width: "0px"}, "slow", "swing");
});
});
---------------------------------------------------
そこで質問なのですが、
・for文ではイベントの登録は行えないのか?
・今回のようなケースの場合、どのように書くのが適切か?
上記2点に関して、ご回答、ご意見を頂けますと幸いです。
どうぞよろしくお願い申し上げます。
No.1ベストアンサー
- 回答日時:
JavaScriptの言語仕様の問題です。
forループが終わってイベント登録が完了した時点では、変数iは3になっています。
その後、ユーザー操作でマウスのクリック動作した時に、イベント関数が呼び出されますから、
> $(divArray[i]).animate({width: "0px"}, "slow", "swing");
この部分は、全て
> $(divArray[3]).animate({width: "0px"}, "slow", "swing");
として処理されることになります。
そのため、期待通りの動作にならないのです。
対策ですが、
---
jQuery(function($){
var buttonArray = ["#button0", "#button1", "#button2"];
var divArray = ["#box0", "#box1", "#box2"];
function setCallback(i) {
$(buttonArray[i]).click(function(){
$(divArray[i])).animate({width: "0px"}, "slow", "swing");
});
}
for(i=0; i<buttonArray.length; i++){
setCallback(i);
}
});
---
のように、イベント設定処理を関数化すれば、ループ中で関数呼び出しにより毎回新たな変数iが作られますから、期待通りの結果になるかと思います。
さらに、無名関数を使えば、
---
jQuery(function($){
var buttonArray = ["#button0", "#button1", "#button2"];
var divArray = ["#box0", "#box1", "#box2"];
for(i=0; i<buttonArray.length; i++){
(function(i) {
$(buttonArray[i]).click(function(){
$(divArray[i])).animate({width: "0px"}, "slow", "swing");
})(i);
}
});
---
のように書くこともでき、もうちょっと簡潔になります。
mtaka2様、ご回答ありがとうございます。
>>JavaScriptの言語仕様の問題です。
>>forループが終わってイベント登録が完了した時点では、変数iは3になっています。
>>その後、ユーザー操作でマウスのクリック動作した時に、イベント関数が呼び出されますから
なるほど…!
forループ毎にイベント登録され、それを呼び出してくれるのではなく、
clickイベント時にループ完了時点の変数iで呼び出されるのですね。
非常によく理解することができました。
また、対策の具体例を2つも提示して頂き、大変助かります。
どちらも試したところ、期待する動作を得ることができました。
jQueryの無名関数は、あらゆる場面で万能ですね…。
引き続き勉強していきたいと思います。
本当にありがとうございました!
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- JavaScript jQueryでのドラッグアンドドロップについて 1 2022/07/07 21:04
- JavaScript jqueryを使ったスムーススクロールのコードを書いたのですが、HTMLコード内にある、a butt 2 2022/04/14 10:59
- JavaScript jQueryでのレスポンシブが綺麗に動かない 3 2022/06/21 11:08
- HTML・CSS 下にスクロールしても、追従するボタンのコードを書いたのですが、ボタンの中の画像が半分しか表示されない 1 2022/04/16 21:31
- HTML・CSS スクロールすると追従する画像のコードを書いているのですが、追従する画像の大きさの調節が上手くいきませ 2 2022/04/18 12:52
- JavaScript ソースコードのいじる場所が分かりません。 1 2022/12/23 02:06
- JavaScript 【Javascript】ボタンクリックで2つのclassに対し、それぞれ別のclassを追加したい 1 2022/07/29 20:52
- JavaScript スマフォではボタンを表示させたくない 2 2023/01/20 14:26
- JavaScript javascriptで移動ボタンを押した際に遷移するボタンを追記したい 1 2022/11/29 03:02
- JavaScript vertical sliderをautoplayしたい 2 2022/08/25 14:47
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
idを使わずにonclickで自身の要...
-
SubWindowを閉じる時に処理する...
-
シューティングゲームの作り方
-
関数でy=g(x)のgとは何の略です...
-
変数のスコープの問題?
-
addEventListener()でリスナー...
-
現在地の取得について
-
Javascriptリアルタイムエラー...
-
jslintのエラーについて質問
-
functionから別のfunctionを実...
-
getElementByIdを使用したグロ...
-
【jQuery】時限式のポップアップ
-
クロージャーの利点が理解できない
-
jQuery1.4.2、jQueryUI1.8.4、t...
-
jQueryでのレスポンシブが綺麗...
-
javascript(jQuery)でセル内...
-
チェックBOX入力後、ある時間に...
-
関数名をテキストから読み込む...
-
プログラミングわからない
-
jQuery cssメソッドでの変数の...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
functionから別のfunctionを実...
-
idを使わずにonclickで自身の要...
-
クリックすると上に開くアコー...
-
関数でy=g(x)のgとは何の略です...
-
ページ内に複数表がある場合のT...
-
jQueryの :not() .not() が有効...
-
関数名をテキストから読み込む...
-
jqueryの変数を関数の外に出す方法
-
javascript(jQuery)でセル内...
-
XMLHttpRequestでキャッシュを...
-
要素名がスペースを含む場合のj...
-
jQueryの"return false"の役割...
-
処理前の「お待ちください」
-
[jQuery] クリックで連番関数を...
-
ajax反映後のjqueryが動かない
-
jQueryにて、.toggle()でアニメ...
-
Tabキーのキャンセル
-
XMLHttpRequestオブジェクトが...
-
JScriptの問題です。添削お願い...
-
jquery 複数のメソッド
おすすめ情報