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

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

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

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

Q&A

解決済

1回答

1310閲覧

【jQuery】 checkbox及びradioを用いた、リアルタイム計算機能

退会済みユーザー

退会済みユーザー

総合スコア0

jQuery

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

0グッド

0クリップ

投稿2019/11/19 06:05

選択した商品の金額が、リアルタイムで出力される機能を作っております。

■ 対象コード

参考サイト:http://sample-program.xyz/

console.log(scores)は配列の中身を確認するために書いております。

html

1 <main id="main"> 2 <div id='app'> 3 <div class="box"> 4 <input type="radio" name="one" data-price="100"> 5 <input type="radio" name="one" data-price="200"> 6 <input type="radio" name="one" data-price="300"> 7 <input type="radio" name="one" data-price="400"> 8 <input type="radio" name="one" data-price="500"> 9 <input type="radio" name="one" data-price="600"> 10 <input type="radio" name="one" data-price="700"> 11 </div> 12 <a href="#" id="submit" title="">送信</a> 13 14 <div class="box"> 15 <input type="radio" class="run" name="model" value="100" data-price="10"> 16 <input type="radio" class="run" name="model" value="200" data-price="20"> 17 <input type="radio" class="run" name="model" value="300" data-price="30"> 18 19 </div> 20 21 <div class="box"> 22 <input type="radio" class="run" name="rank" value="400" data-price="100"> 23 <input type="radio" class="run" name="rank" value="500" data-price="200"> 24 <input type="radio" class="run" name="rank" value="600" data-price="300"> 25 </div> 26 27 <div class="box"> 28 <input type="radio" class="run" name="jamp" value="400" data-price="1000"> 29 <input type="radio" class="run" name="jamp" value="500" data-price="2000"> 30 <input type="radio" class="run" name="jamp" value="600" data-price="3000"> 31 </div> 32 33 <div class="box"> 34 <input type="radio" class="run" name="bomb" value="400" data-price="10000"> 35 <input type="radio" class="run" name="bomb" value="500" data-price="20000"> 36 <input type="radio" class="run" name="bomb" value="600" data-price="30000"> 37 </div> 38 39 <div class="box"> 40 <input type="checkbox" name="bomb" value="400" data-price="1"> 41 <input type="checkbox" name="bomb" value="500" data-price="2"> 42 <input type="checkbox" name="bomb" value="600" data-price="3"> 43 </div> 44 45 <div class='text-right'> 46 <p> 小計¥ <span id="sum">0</span></p> 47 <p>消費税¥ <span id="tax">0</span></p> 48 <p> 合計¥ <span id="all">0</span></p> 49 </div> 50 51 </div> 52 </main> 53 <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script> 54 <script> 55 $(function() { 56 var scores = []; 57 $(':radio.run').on('change',function() { 58 scores = $(':radio:checked').map(function(){ 59 return parseInt($(this).data("price")); 60 }).get(); 61 sum = scores.reduce((a,x)=>a+x); 62 $("#sum").text(sum); 63 $("#tax").text(sum * 0.1); 64 $("#all").text(sum + sum* 0.1); 65 console.log(scores); 66 }); 67 68 $('a#submit').on('click', function() { 69 scores = $(':radio:checked').map(function(){ 70 return parseInt($(this).data("price")); 71 }).get(); 72 sum = scores.reduce((a,x)=>a+x); 73 $("#sum").text(sum); 74 $("#tax").text(sum * 0.1); 75 $("#all").text(sum + sum* 0.1); 76 console.log(scores); 77 }); 78 79 $(':checkbox').on('click', function() { 80 scores = $(':checkbox:checked').map(function(){ 81 return parseInt($(this).data("price")); 82 }).get(); 83 sum = scores.reduce((a,x)=>a+x); 84 console.log(scores); 85 }); 86 87 }); 88 89 </script>

■ 現状の課題

input:radioの値は全て同じ配列に追加することはできました。
ただ、input:checkboxの値は、同じ配列に追加することができませんでした。
input:radio及びinput:checkboxの値を、全て同じ配列に入れ、小計に出力したいです。

■ 質問

2つ質問があります。

【質問1】

checkbox:checkeddata-priceの値も、配列scoresに追加したいのですが、現状できておりません。
radio:checkedと同様、配列scoresに追加することは可能でしょうか。

【質問2】

jQueryの中に、全く同じコードが3つあります。
1つにまとめることはできないでしょうか。

<対象コード>

jquery

1 <script> 2sum = scores.reduce((a,x)=>a+x); 3$("#sum").text(sum); 4$("#tax").text(sum * 0.1); 5$("#all").text(sum + sum* 0.1); 6</script> 7

何卒、よろしくおねがいいたします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

  • 「#submit」のくだりが何をしたいのかわかりません
  • radioもcheckboxもいっしょくたにやってよいのでしょうか?
  • valueとdata-priceの使い分けもよくわかりません

javascript

1$(function() { 2 var scores = []; 3 $(':radio.run ,.box :checkbox').on('change',function() { 4 scores = $(':radio.run:checked,.box :checkbox:checked').map(function(){ 5 return parseInt($(this).data("price")); 6 }).get(); 7 sum = scores.reduce((a,x)=>a+x); 8 $("#sum").text(sum); 9 $("#tax").text(sum * 0.1); 10 $("#all").text(sum + sum* 0.1); 11 console.log(scores); 12 }).eq(0).trigger('change'); 13 14 $('a#submit').on('click', function(e) { 15 e.preventDefault(); 16 $(':radio.run').eq(0).trigger('change'); /* ここ追記 */ 17 }); 18});

調整版

※解釈を変更しました。
一度でも#submitをおしたらoneの値を追加します

javascript

1$(function() { 2 $(':radio.run ,.box :checkbox,[name=one]').on('change',function(e) { 3 var scores = $(':radio.run:checked,.box :checkbox:checked').map(function(){ 4 return parseInt($(this).data("price")); 5 }).get()||[]; 6 if($('a#submit').data("flg")=="1" && $('[name=one]:checked').length>0){ 7 scores.push($('a#submit').data("flg")*$('[name=one]:checked').data('price')||0); 8 } 9 console.log(scores); 10 if(scores.length>0){ 11 var sum = scores.reduce((a,x)=>a+x); 12 $("#sum").text(sum); 13 $("#tax").text(sum * 0.1); 14 $("#all").text(sum + sum* 0.1); 15 } 16 }).eq(0).trigger('change'); 17 $('a#submit').on('click', function(e) { 18 e.preventDefault(); 19 $(this).data("flg",1); 20 $(':radio.run').eq(0).trigger('change'); 21 }).data("flg",0); 22}); 23

再調整版

javascript

1$(function() { 2 $(':radio.run ,.box :checkbox,[name=one]').on('change',function(e) { 3 var scores = $(':radio.run:checked,.box :checkbox:checked').map(function(){ 4 return parseInt($(this).data("price")); 5 }).get()||[]; 6 if($('a#submit').data("price")>0){ 7 scores.push($('a#submit').data("price")); 8 } 9 console.log(scores); 10 if(scores.length>0){ 11 var sum = scores.reduce((a,x)=>a+x); 12 $("#sum").text(sum); 13 $("#tax").text(sum * 0.1); 14 $("#all").text(sum + sum* 0.1); 15 } 16 }).eq(0).trigger('change'); 17 $('a#submit').on('click', function(e) { 18 e.preventDefault(); 19 $(this).data("price",$('[name=one]:checked').data('price')); 20 $(':radio.run').eq(0).trigger('change'); 21 }).data("price",0); 22});

投稿2019/11/19 06:20

編集2019/11/19 07:51
yambejp

総合スコア114829

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

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

退会済みユーザー

退会済みユーザー

2019/11/19 06:31 編集

先ほども有難うございます。 いただいた質問に対しての回答が下記の通りです。 1.「#submit」のくだりが何をしたいのかわかりません →モーダルで商品を一覧表示する機能があります。そこで、モーダル内で商品をチェックされたとしても、決定を押さないと金額が表示されない機能を実装するためです。 モーダルで商品をチェックした状態でモーダルを閉じてしまうと、商品は反映されずに金額だけ出力されてしまうので、#submitをキーとしました。 具体的なページが下記の中での「パターの種類」の部分です。 http://sample-program.xyz/index2.html 2.radioもcheckboxもいっしょくたにやってよいのでしょうか? →はい、問題ありません。 3.valueとdata-priceの使い分けもよくわかりません →こちら、valueは間違いです。無視していただいて構いません。
yambejp

2019/11/19 06:34

で、私の記載したサンプルではどう動きが違うのでしょうか?
退会済みユーザー

退会済みユーザー

2019/11/19 06:42 編集

申し訳ございません、抜けておりました。 checkbox及びradioは問題ありません。 誠に有難うございます。 ただ、a#submitの部分がうまく機能しておりません。 a#submitに関しては、a#submitをクリックしたタイミングで、a#submit上部にあるradioの中で、選択されてるradioの値が小計に足されるよう実装したいです。
yambejp

2019/11/19 06:47

一応追記しておきましたが 「a#submit上部にあるradioの中で、選択されてるradioの値が小計に足される」 ということは他のラジオボタンやチェックボックスとは動きが違うのですね?
退会済みユーザー

退会済みユーザー

2019/11/19 06:52

説明不足で誠に申し訳ございません。 他のと同様、a#submitを押したら、a#submit上部にある選択されてるradioのdata-priceの値が配列scoresに足され、配列scoresの値を小計に出力したいです。
yambejp

2019/11/19 07:07 編集

調整版追記しました、動作あってますか? (なんか微妙に違う気もします・・)
退会済みユーザー

退会済みユーザー

2019/11/19 07:10

a#submitで配列scoresに入りました! ただ、異なるradioをクリックすると、a#submitの値が上書きされてしまいます。 実際にアップしてみました。 http://sample-program.xyz/ <理想> radio → scores [10] a#submit → scores [10, 100] radio → scores [10, 100, 1000] <現状> radio → scores [10] a#submit → scores [100] radio → scores [100, 1000] (※scoresの配列に追加される値は適当です。) 手取り足取り申し訳ございません。
yambejp

2019/11/19 07:13 編集

> 異なるradioをクリックすると、a#submitの値が上書きされてしまいます。 えー、そういう仕様ではないのでしょうか? 送信の前のチェックボックスは常に足して良いのですか? もしくはa#submitを押す前は足しちゃいけないのですかね?
退会済みユーザー

退会済みユーザー

2019/11/19 07:23 編集

上記質問を下記にまとめました。 <div class="box1"> <input type="radio" name="one" data-price="100"> <input type="radio" name="one" data-price="200"> <input type="radio" name="one" data-price="300"> </div> <a href="#" id="submit" title="">送信</a> <div class="box2"> <input type="radio" class="run" name="two" data-price="10"> <input type="radio" class="run" name="two" data-price="20"> <input type="radio" class="run" name="two" data-price="30"> </div> <div class="box3"> <input type="radio" class="run" name="three" data-price="10"> <input type="radio" class="run" name="three" data-price="20"> <input type="radio" class="run" name="three" data-price="30"> </div> <div class="box4"> <input type="checkbox" data-price="1"> <input type="checkbox" data-price="2"> <input type="checkbox" data-price="3"> </div> box1 → 選択された:radioのdata-priceを、a#submiを押されたタイミングで配列scoresに入れる(submitをしないと、配列scoresに追加しない) box2 → 選択された:radio.runのdata-priceを、:radio.runがチェックされたタイミングで配列scoresに入れる box3 → box2同様 box4 → 選択された全ての:checkboxを、:checkboxがチェックされたタイミングで配列scoresに入れる 上記で伝わっておりますでしょうか? 説明力がなく申し訳ございません。
退会済みユーザー

退会済みユーザー

2019/11/19 07:26 編集

現状は、box1の:radioのdata-priceが、a#submitをクリックすることで配列scoresに追加されるのですが、box2の:radioをクリックすると、box1で配列scoresに追加されたdata-priceが、box2の:radioのdata-priceで上書きされてしまいます。
yambejp

2019/11/19 07:28

box1を選んでa#submitでbox1の値が追加されるとして box2でbox1の値を消さない? そこでbox1が変更されたらどうするのでしょうか? なにか仕様が変だと思いいますが
退会済みユーザー

退会済みユーザー

2019/11/19 07:32

はい、box2でbox1の値は消えません。 box1 :radio a#submit → scores[box1 data-price] box2 :radio → scores[box1 data-price, box2 data-price] box3 :radio → scores[box1 data-price, box2 data-price, box3 data-price] box1 :radio a#submit → scores[box1 data-price(上書き), box2 data-price, box3 data-price] a#submitは、box1のみに適用されるものです。
yambejp

2019/11/19 07:41

調整版を修正しました、どうでしょう?
退会済みユーザー

退会済みユーザー

2019/11/19 07:46

本当に申し訳ございません。 box1はsubmitしたタイミング"のみ"、小計に足されていきます。 現状は1回目に関してはa#submitで配列に追加されますが、2回目に関してはa#submitをしなくてもradioが配列scoresに反映されてしまいます。 理想としては、box1に関しては、回数問わず、submitしたタイミングのみ、radioのdata-priceが配列scoresに追加あるいは上書きされていくイメージです。 本当に申し訳ございません。
yambejp

2019/11/19 07:51

文字のやり取りなので仕様がうまく伝わらないのは仕方ないですね。 再調整版でどうでしょう?
退会済みユーザー

退会済みユーザー

2019/11/19 07:53

本当に有難うございます! イメージ通りのものができました。 ただ、私が知らないコードが多いので、1つ1つ解釈していきます。 長い間お付き合い、有難うございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問