🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
JavaScript

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

jQuery

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

Q&A

解決済

2回答

1689閲覧

ループ処理の原理がわからない

masaru_666

総合スコア13

JavaScript

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

jQuery

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

0グッド

0クリップ

投稿2019/11/20 03:37

編集2019/11/20 03:54

それぞれのラベルをクリックした際にテキストを変更するスクリプトを作ろうと思ってい調べたところ以下のコードで実現できたのですが、ループの中の.on("click", { value: i + 1 }, onClick)の部分がどういう意味なのかと、途中で出てくるe.data.valueの部分が何を表しているのかが調べてもイマイチわかりませんでした。
どういう原理で動いているのか詳しく理解したく思い質問させていただきました。
ご教授していただけると助かります。

html

1 <p>色を選択してください<span class="color-text">カラー</span></p> 2<div class="color"> 3<input type="radio" id="check-color1" name="check-color" /> 4<label class="check-color-item" for="check-color1"></label> 5 6<input type="radio" id="check-color2" name="check-color"/> 7<label class="check-color-item" for="check-color2"></label> 8 9<input type="radio" id="check-color3" name="check-color"/> 10<label class="check-color-item" for="check-color3"></label> 11 12<input type="radio" id="check-color4" name="check-color"/> 13<label class="check-color-item" for="check-color4"></label> 14</div>

javascript

1for (var i = 0; i < 4; i++) { 2 $(".check-color-item").eq(i).on("click", { value: i + 1 }, onClick); 3} 4function onClick(e) { 5 if(e.data.value == 1){ 6 $(".color-text").text('b'); 7} else if(e.data.value == 2){ 8 $(".color-text").text('r'); 9}else if(e.data.value == 3){ 10 $(".color-text").text('g'); 11}else if(e.data.value == 4){ 12 $(".color-text").text('y'); 13} 14} 15

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

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

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

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

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

H40831

2019/11/20 03:47 編集

jQueryタグの追加をオススメします。
m.ts10806

2019/11/20 03:59

「何を表しているか調べた」とはどのようにしたのでしょうか。
m.ts10806

2019/11/20 04:00

「どういう原理」だけだと極論「書いた通りに動いている」と返されます。自身が理解したこと把握していることを具体的に書かれた方がよいかと思います
退会済みユーザー

退会済みユーザー

2019/11/20 07:56 編集

> 「どういう原理」だけだと極論「書いた通りに動いている」と返されます。 おす! そうじゃなかったみてぇだな。
guest

回答2

0

ベストアンサー

おす!

あのな、

jQuery

1$(selector).eq(position); 2$(selector).on(event, data, function);

は両方とも、JavaScript 製ライブラリの jQuery が提供している API だ。

jQuery

1$(selector)

は selector で示してある ID や class とかの要素の操作を行うことを jQuery に明示するんだ。

jQuery

1$(selector).eq(position);

は、上で書いた明示された要素の内、ページ記述の一番上から数えて position 番目の要素の操作を行う事を jQuery に明示してんだ。

jQuery

1$(selector).on(event, data, callback);

は、上で書いた明示された要素について、event イベントが発生した場合に処理を行う callback 関数を jQuery に明示してんだ。
その際に、callback 関数に data を引数として渡す、って意味だ。

つまり、for 文で 0 から 3 までの整数を順番に生成しながら、
check-color-item ってぇクラスを持つ DOM 要素について、
click イベントが発生した場合に処理を任せるコールバックとして onClick() って名の関数を登録、その関数を呼ぶ際には value ってぇキーについて値がさっき生成された整数+1 を持ったオブジェクトを、大本になる event イベントオブジェクトの data って名のキーに設定して、onClick()関数に引数として渡してくれ、って jQuery に教えてるわけだ。

この $(selector).on() はあくまでも、上に書いた処理の定義を登録するだけで、この時点では何もおきねぇ。

そんでよぅ、実際に selector がクリックされた時、つまり、check-color-item ってぇクラスを持つ DOM 要素がクリックされた時に、onClick(e) 関数が呼ばれるんだが、 e にはクリックイベントオブジェクトが渡されてきて、その中の data ってキーには、さっき登録した { value: i + 1 } が設定されてる。
つまり、ドキュメントの上の方から数えて最初の要素のときは e.data.value = 1 が設定されてるし、
その次は e.data.value = 2 だし…ってぇ感じだ。

あとは、その値を if 文で調べて処理を分岐させてるだけだぞ。

投稿2019/11/20 04:16

編集2019/11/20 04:20
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

masaru_666

2019/11/20 06:36

順を追っての説明していただき大変わかりやすかったです。 ありがとうございます。
guest

0

onの中でオブジェクト{}を指定すると、イベントにデータをマッピングできます
見た感じ単にそれをやりたいだけのソースに見えますね
e.dataの参照はよほどの指示がないかぎりおそらくめったに使わない機能の一つです

sample

一応元のソースがひどいのでjQueryらしく書くとこんな感じ?

javascript

1$(function(){ 2 $(".check-color-item").on("click",function(e){ 3 var datas={1:"b",2:"r",3:"g",4:"y"}; 4 var idx=$(".check-color-item").index(this); 5 e.data={value:1+idx}; 6 console.log(e.data); 7 $(".color-text").text(datas[e.data.value]); 8 }); 9});

でも、わざわざイベントのdataを介入しなくてもインデックスを利用して
直接参照させればいいので、こうした方が楽

javascript

1$(function(){ 2 $(".check-color-item").on("click",function(e){ 3 var datas=["b","r","g","y"]; 4 var idx=$(".check-color-item").index(this); 5 $(".color-text").text(datas[idx]); 6 }); 7}); 8

投稿2019/11/20 03:59

編集2019/11/20 04:29
yambejp

総合スコア116694

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

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

masaru_666

2019/11/20 06:43

説明に加えてソースコードの訂正でより簡潔な書き方の参考になりました。 ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問