\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n```\r\n\r\nここでやりたいことは\r\n・.boxをクリックしてi===numであれば'win'という文字を表示させ、.winクラスを追加\r\n・iとnumが違えば'lose'を表示し、.loseクラスを追加することです。\r\n・'win'と表示させるのは一つのみ(4つは'lose')\r\nです。\r\n\r\n現在のコードではどの.boxをクリックしても'lose'と出てしまいます。\r\nアドバイスお願いいたします。","answerCount":3,"upvoteCount":0,"datePublished":"2019-09-01T16:51:00.819Z","dateModified":"2019-09-01T16:51:00.819Z","acceptedAnswer":{"@type":"Answer","text":"こんにちは\r\n修正案の一例を回答します。\r\n\r\nご質問に挙げられているコードの問題点は、以下の(1),(2) の2点です。\r\n\r\n(1) `.box` がクリックされたときに呼ばれる関数の中で、`if (i === num) {` のところの\r\n- `i` の値は、`for (var i = 1; i <= 5; i++) {` のループから抜けたときの値なので、 `6` になっている。\r\n- `num` は 1以上5以下\r\n\r\nなので、`i === num` は常にfalse になる。\r\n\r\n(2) `text()` と `addClass()` で `win`か`lose`を設定している対象が `$('.box')`になっており、これだと、全 `.box` が対象になってしまう。\r\n\r\n上記の(1)(2) によって\r\n\r\n> 現在のコードではどの.boxをクリックしても'lose'と出てしまいます。\r\n\r\nということになります。上記の対応含めて、以下のように修正します。\r\n\r\n- `for (var i` の `var` を `let` に修正。また以下にあわせて、`i` を(1以上5以下ではなく)0から4で回す。\r\n- `.box`のクリックハンドラ内で、 `num` との比較対象を、クリックされた `.box`のインデクス(0始まり)とする。\r\n- 上記にあわせて、 `num`は 0以上4以下となるように修正\r\n- `text()` と `addClass()` の対象をクリックされた、当該の `.box` に限るようにする。\r\n- `.box` の個数を定数 `NUM_BOXES` とする。\r\n\r\n上記の諸点を修正したものが以下です。\r\n\r\n```javascript\r\n$(function () {\r\n const NUM_BOXES = 5;\r\n const num = Math.floor(Math.random() * NUM_BOXES);\r\n\r\n for (let i = 0; i < NUM_BOXES; i++) {\r\n $('.box-container').append('
');\r\n console.log('i:' + i);\r\n }\r\n\r\n $('.box').on('click', function () {\r\n if ($('.box').index(this) === num) {\r\n $(this).text('win');\r\n $(this).addClass('win');\r\n } else {\r\n $(this).text('lose');\r\n $(this).addClass('lose');\r\n }\r\n });\r\n\r\n console.log('num:' + num);\r\n});\r\n```\r\n\r\n上記のコードで、 `.box` に設定しているクリックハンドラは、以下のように短く書くことができます。\r\n\r\n```javascript\r\n$('.box').on('click', function () {\r\n const winOrLose = $('.box').index(this) === num ? 'win' : 'lose';\r\n $(this).text(winOrLose).addClass(winOrLose);\r\n});\r\n```\r\n\r\n- 動作確認用 CodePen: [https://codepen.io/jun68ykt/pen/bGbrJzw](https://codepen.io/jun68ykt/pen/bGbrJzw)\r\n\r\n以上、参考になれば幸いです。","dateModified":"2019-09-01T18:41:16.476Z","datePublished":"2019-09-01T18:24:20.224Z","upvoteCount":1,"url":"https://teratail.com/questions/209562#reply-309158"},"suggestedAnswer":[{"@type":"Answer","text":"提示されたコードの`i`は判定する時点で必ず6になります。data属性でも付けて区別しないと、`num`と比較しても`false`になります。\r\n```js\r\n for (var i = 1; i <= 5; i++) {\r\n $('.box-container').append('
');\r\n }\r\n console.log('i:' + i); // 6\r\n```\r\n\r\n【data-* - HTML: HyperText Markup Language | MDN】\r\n[https://developer.mozilla.org/ja/docs/Web/HTML/Global_attributes/data-*](https://developer.mozilla.org/ja/docs/Web/HTML/Global_attributes/data-*)\r\n\r\n---\r\n\r\n**追記:**\r\n\r\n\r\n```JavaScript\r\nvar num = Math.floor( Math.random() * 5 ) + 1;\r\nvar $container = $( '.box-container' );\r\nfor ( var i = 1; i <= 5; i++ ) {\r\n\t$container.append( '
' );\r\n}\r\n$container.on( 'click', '.box', function () {\r\n\tif ( $( this ).data( 'num' ) === num ) $( this ).text( 'win' ).addClass( 'win' );\r\n\t$( '.box', $container ).not( '.win' ).text( 'lose' ).addClass( 'lose' );\r\n} );\r\n```**動くサンプル:**[https://jsfiddle.net/fmbh0crj/](https://jsfiddle.net/fmbh0crj/)\r\n\r\n---\r\n\r\n【.not() | jQuery API Documentation】\r\n[https://api.jquery.com/not/](https://api.jquery.com/not/)","dateModified":"2019-09-01T17:44:07.966Z","datePublished":"2019-09-01T17:08:37.804Z","upvoteCount":2,"url":"https://teratail.com/questions/209562#reply-309149","comment":[{"@type":"Comment","text":"「'win'と表示させるのは一つのみ(4つは'lose')」という条件は多分「クリックした物があたりなら'win'そうでない物は'lose'と表示」という意味かと思いました。","datePublished":"2019-09-01T18:32:16.014Z","dateModified":"2019-09-01T18:32:16.014Z"}]},{"@type":"Answer","text":"添削してみましたが、こんなかんじでいかがでしょうか (動作未確認ですmm\r\n\r\n```javascript\r\n$(function () {\r\nvar num = Math.floor(Math.random() * 5) + 1;\r\n // 動作としては i を定義; ループが終わったら i++; i<=5じゃなければ抜ける\r\n // つまりこの for が終わった時点で i == 6\r\n for (var i = 1; i <= 5; i++) { \r\n $('.box-container').append('
');\r\n  console.log('i:' + i);\r\n }\r\n\r\n // $('.box').on('click', function () { // 誤 全部の .box に同じ click の動作を設定しまっている\r\n $(.box).each(function(index, box){ // 正 クリックされた .box が何番目か判定する必要があるので、 each で何番目かのindex と一緒に順番にイベント設定\r\n // if (i === num) { // 誤 i == 6になっている\r\n if (index === num) { // 正 index を使う\r\n box.on('click', function () \r\n box.text('win');\r\n box.addClass('win');\r\n });\r\n } else {\r\n box.on('click', function () {\r\n box.text('lose');\r\n box.addClass('lose');\r\n });\r\n }\r\n })\r\nconsole.log('num:' + num);\r\n});\r\n```","dateModified":"2019-09-01T17:19:59.678Z","datePublished":"2019-09-01T17:08:23.519Z","upvoteCount":1,"url":"https://teratail.com/questions/209562#reply-309148","comment":[{"@type":"Comment","text":"「$('.box').text('win');」としてしまうと全て「win」になりますね。","datePublished":"2019-09-01T17:15:53.297Z","dateModified":"2019-09-01T17:15:53.297Z"},{"@type":"Comment","text":"ありがとうございます、そもそも色々変だったので直しましたmm","datePublished":"2019-09-01T17:21:01.431Z","dateModified":"2019-09-01T17:21:01.431Z"}]}],"breadcrumb":{"@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"item":{"@id":"https://teratail.com","name":"トップ"}},{"@type":"ListItem","position":2,"item":{"@id":"https://teratail.com/tags/jQuery","name":"jQueryに関する質問"}},{"@type":"ListItem","position":3,"item":{"@id":"https://teratail.com/questions/209562","name":"jQueryで要素をクリックした時、ランダムな数字を引き当てるとクラスを追加したい。"}}]}}}
質問するログイン新規登録

Q&A

解決済

3回答

1119閲覧

jQueryで要素をクリックした時、ランダムな数字を引き当てるとクラスを追加したい。

mkscia

総合スコア18

jQuery

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

0グッド

0クリップ

投稿2019/09/01 16:51

0

0

質問させてください。
jQueryでくじ引きゲームをしたいのですが、判定が機能しません。

<html lang="ja"> <head> <!-- Required meta tags --> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"> <!-- Bootstrap CSS --> <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous"> <link rel="stylesheet" href="style.css"> </head> <body> <div class="box-container"> </div> <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script> </body> </html> <style> .box { height: 200px; width: 200px; background: paleturquoise; transition: 1s; margin: 10px; text-align: center; line-height: 200px; } .win { border-radius: 50%; background:red; transform: rotate(360deg); background-size: cover; background-position: 46%; } </style> <script> $(function () { var num = Math.floor(Math.random() * 5) + 1; for (var i = 1; i <= 5; i++) { $('.box-container').append('<div class="box"></div>');   console.log('i:' + i); } $('.box').on('click', function () { if (i === num) { $('.box').text('win'); $('.box').addClass('win'); } else { $('.box').text('lose'); $('.box').addClass('lose'); } }) console.log('num:' + num); }); </script>

ここでやりたいことは
・.boxをクリックしてi===numであれば'win'という文字を表示させ、.winクラスを追加
・iとnumが違えば'lose'を表示し、.loseクラスを追加することです。
・'win'と表示させるのは一つのみ(4つは'lose')
です。

現在のコードではどの.boxをクリックしても'lose'と出てしまいます。
アドバイスお願いいたします。

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

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

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

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

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

guest

回答3

0

提示されたコードのiは判定する時点で必ず6になります。data属性でも付けて区別しないと、numと比較してもfalseになります。

js

1 for (var i = 1; i <= 5; i++) { 2 $('.box-container').append('<div class="box" data-num="' + i + '"></div>'); 3 } 4 console.log('i:' + i); // 6

【data-* - HTML: HyperText Markup Language | MDN】
https://developer.mozilla.org/ja/docs/Web/HTML/Global_attributes/data-*


追記:

JavaScript

1var num = Math.floor( Math.random() * 5 ) + 1; 2var $container = $( '.box-container' ); 3for ( var i = 1; i <= 5; i++ ) { 4 $container.append( '<div class="box" data-num="' + i + '"></div>' ); 5} 6$container.on( 'click', '.box', function () { 7 if ( $( this ).data( 'num' ) === num ) $( this ).text( 'win' ).addClass( 'win' ); 8 $( '.box', $container ).not( '.win' ).text( 'lose' ).addClass( 'lose' ); 9} ); 10```**動くサンプル:**[https://jsfiddle.net/fmbh0crj/](https://jsfiddle.net/fmbh0crj/) 11 12--- 13 14.not() | jQuery API Documentation】 15[https://api.jquery.com/not/](https://api.jquery.com/not/)

投稿2019/09/01 17:08

編集2019/09/01 17:44
kei344

総合スコア69643

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

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

kei344

2019/09/01 18:32

「'win'と表示させるのは一つのみ(4つは'lose')」という条件は多分「クリックした物があたりなら'win'そうでない物は'lose'と表示」という意味かと思いました。
guest

0

ベストアンサー

こんにちは
修正案の一例を回答します。

ご質問に挙げられているコードの問題点は、以下の(1),(2) の2点です。

(1) .box がクリックされたときに呼ばれる関数の中で、if (i === num) { のところの

  • i の値は、for (var i = 1; i <= 5; i++) { のループから抜けたときの値なので、 6 になっている。
  • num は 1以上5以下

なので、i === num は常にfalse になる。

(2) text()addClass()winloseを設定している対象が $('.box')になっており、これだと、全 .box が対象になってしまう。

上記の(1)(2) によって

現在のコードではどの.boxをクリックしても'lose'と出てしまいます。

ということになります。上記の対応含めて、以下のように修正します。

  • for (var ivarlet に修正。また以下にあわせて、i を(1以上5以下ではなく)0から4で回す。
  • .boxのクリックハンドラ内で、 num との比較対象を、クリックされた .boxのインデクス(0始まり)とする。
  • 上記にあわせて、 numは 0以上4以下となるように修正
  • text()addClass() の対象をクリックされた、当該の .box に限るようにする。
  • .box の個数を定数 NUM_BOXES とする。

上記の諸点を修正したものが以下です。

javascript

1$(function () { 2 const NUM_BOXES = 5; 3 const num = Math.floor(Math.random() * NUM_BOXES); 4 5 for (let i = 0; i < NUM_BOXES; i++) { 6 $('.box-container').append('<div class="box"></div>'); 7 console.log('i:' + i); 8 } 9 10 $('.box').on('click', function () { 11 if ($('.box').index(this) === num) { 12 $(this).text('win'); 13 $(this).addClass('win'); 14 } else { 15 $(this).text('lose'); 16 $(this).addClass('lose'); 17 } 18 }); 19 20 console.log('num:' + num); 21});

上記のコードで、 .box に設定しているクリックハンドラは、以下のように短く書くことができます。

javascript

1$('.box').on('click', function () { 2 const winOrLose = $('.box').index(this) === num ? 'win' : 'lose'; 3 $(this).text(winOrLose).addClass(winOrLose); 4});

以上、参考になれば幸いです。

投稿2019/09/01 18:24

編集2019/09/01 18:41
jun68ykt

総合スコア9058

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

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

mkscia

2019/09/02 13:37

iがループ処理から外れていたからfalseになっていたのですね。 一つをクリックしたらほか全てが'lose'となっていたのも、クラスを指定していたからでしたか... おかげで様で思った通りの動作を実装することが出来ました。 大変わかりやすい説明ありがとうございました。
jun68ykt

2019/09/03 00:21

どういたしまして。 > 思った通りの動作を実装することが出来ました。 とのことでよかったです????
guest

0

添削してみましたが、こんなかんじでいかがでしょうか (動作未確認ですmm

javascript

1$(function () { 2var num = Math.floor(Math.random() * 5) + 1; 3 // 動作としては i を定義; ループが終わったら i++; i<=5じゃなければ抜ける 4 // つまりこの for が終わった時点で i == 6 5 for (var i = 1; i <= 5; i++) { 6 $('.box-container').append('<div class="box"></div>'); 7  console.log('i:' + i); 8 } 9 10 // $('.box').on('click', function () { // 誤 全部の .box に同じ click の動作を設定しまっている 11 $(.box).each(function(index, box){ // 正 クリックされた .box が何番目か判定する必要があるので、 each で何番目かのindex と一緒に順番にイベント設定 12 // if (i === num) { // 誤 i == 6になっている 13 if (index === num) { // 正 index を使う 14 box.on('click', function () 15 box.text('win'); 16 box.addClass('win'); 17 }); 18 } else { 19 box.on('click', function () { 20 box.text('lose'); 21 box.addClass('lose'); 22 }); 23 } 24 }) 25console.log('num:' + num); 26});

投稿2019/09/01 17:08

編集2019/09/01 17:20
unhappychoice

総合スコア1531

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

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

kei344

2019/09/01 17:15

「$('.box').text('win');」としてしまうと全て「win」になりますね。
unhappychoice

2019/09/01 17:21

ありがとうございます、そもそも色々変だったので直しましたmm
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.29%

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

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

質問する

関連した質問