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

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

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

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

jQuery

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

Q&A

解決済

4回答

7307閲覧

for文の中にif文を入れて判定した結果

Xylopone_2

総合スコア13

JavaScript

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

jQuery

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

0グッド

0クリップ

投稿2016/05/12 06:11

###前提・実現したいこと
htmlにボタンを5つ置いて、それぞれIDを
"ID_0","#ID_1","#ID_2","#ID_3","#ID_4"と設定し、
javascriptでこういうコードを書きました

for(var i=0; i<5; i++){ var id_name = "#ID_%d".replace("%d",i); $(id_name).click(function(){ console.log(id_name); } }

それぞれボタンを押した時に

#ID_0 #ID_1 #ID_2 #ID_3 #ID_4

となって欲しいんです

結果は

#ID_4 #ID_4 #ID_4 #ID_4 #ID_4

どのボタン押しても#ID_4になってしまいます。
最大値が変わってもどのボタンを押したか取得できるようにfor文で回しながら取れるようにしたいです。
どうぞよろしくお願いします。

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

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

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

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

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

guest

回答4

0

ベストアンサー

まず、Syntaxエラーがあります。

javascript

1$(id_name).click(function(){ 2 console.log(id_name); 3 }

最後に閉じ括弧がありません。
ブラウザの開発者ツールを見ると「Syntax Error」が出ているはずです。

何故「4」になるのかは他の回答者の仰るとおりです。
基本的にループ内で関数を定義するのは避けてください。開発者ツールによってはWarningが出ると思います。

以下のようにclass属性でクリックされたらイベントをキャッチし、押されたIDを調べる方法があります。

html

1<button id="ID_0" class="button">ID_0</button> 2<button id="ID_1" class="button">ID_1</button> 3<button id="ID_2" class="button">ID_2</button> 4<button id="ID_3" class="button">ID_3</button> 5<button id="ID_4" class="button">ID_4</button>

javascript

1$('.button').click(function () { 2 console.log(this.id); 3});

jsbinはこちら
http://jsbin.com/licujecuje/edit?html,js,console,output

投稿2016/05/12 06:48

romiogaku

総合スコア546

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

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

0

JavaScriptでは、変数は関数スコープか、グローバススコープしかありません。ブロックスコープという概念はそもそもないです。では、どうするか、というと、このようなアイデアがあります。

JavaScript

1for(var i=0; i<5; i++){ 2 (function() { 3 var id_name = "#ID_%d".replace("%d",i); 4 $(id_name).click(function(){ 5 console.log(id_name); 6 } 7 })(); 8}

このようにすれば動くと思いますがいかがでしょうか?

投稿2016/05/12 06:36

MH35

総合スコア73

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

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

0

javascriptには少し変わったところがあって、clickイベント実行時のid_nameは、実行時のシンボルid_nameの値を取りに行ってしまいます。id_nameはループ毎に更新されて、実行時には最後の値を使うことになります。

よって、実行時に名前を取得するようにすればいいので、$(this).idを使ってはいかがでしょうか。

投稿2016/05/12 06:33

iwamoto_takaaki

総合スコア2883

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

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

0

まず、どうして処理がおかしくなっているかと言うと、
ボタンをクリックする時には既にid_nameの値が4になってしまっている為です。
clickイベント自体は問題なく宣言できても、
その中の処理はクリックして始めて実行されるので、結果は4となってしまいます。

予め配列の中にID名をキーとした値を入れておくですとか、
クリックした後でも値の変わらない方法を考えていけば上手く行くと思います。

[追記] 簡単ですがサンプルを作ってみました。
ただ、これくらいの処理であればイベントは1つだけ宣言しておいて、
クリック後に「何をクリックしたか」調べて、その後の処理に繋いだ方が綺麗かもしれませんね。
少しでも参考になりましたら……。

javascript

1var click_text = []; 2for(var i=0; i<5; i++){ 3 var id_name = "#ID_%d".replace("%d",i); 4 click_text[i] = id_name; 5 $(id_name).click(function(){ 6 var this_id = '#' + $(this).attr('id'); 7 console.log(click_text[this_id]); 8 }); 9}

投稿2016/05/12 06:29

編集2016/05/12 06:35
gzrita

総合スコア236

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問