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

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

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

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

Q&A

解決済

4回答

639閲覧

【jQuery】フォームで2種類の価格を振り分けて計算したい

hit-machine

総合スコア12

jQuery

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

0グッド

0クリップ

投稿2018/12/25 04:21

編集2018/12/25 07:11

前提・実現したいこと

メールフォームで商品の予約フォームを作っています。
サイズ違いで 2種類の価格があり、
商品の色ごとにそれぞれ注文できるフォームです。
色が違っても価格はサイズ共通です。

例)
色:赤  サイズ:S / L 数量:1〜4
色:青  サイズ:S / L 数量:1〜4
色:黄  サイズ:S / L 数量:1〜4
色:緑  サイズ:S / L 数量:1〜4
色:紫  サイズ:S / L 数量:1〜4
色:黒  サイズ:S / L 数量:1〜4

色はチェックボックスで選び、
サイズ、数量は、セレクトボックスで選ぶようにしています。

最終的に下記のように表示させたいです。
Sサイズ:合計▲▲枚 × 600円 = ▲,▲▲▲円
Lサイズ:合計▲▲枚 × 900円 = ▲,▲▲▲円
送料:500円
合計 ▲,▲▲▲円

発生している問題・エラーメッセージ

商品の合計数と合計金額をサイズごとに集計して表示したいのですが、
Sサイズ / Lサイズ の金額の振り分けができません。

該当のソースコード

html

1<label class="color"> 2 <input type="checkbox" name="color" value="color01 on" onclick="connecttext('size01',this.checked);"> 34</label> 5<select class="parent" id="size01" name="size01" disabled required> 6 <option value="" class="msg" disabled selected>サイズを選択</option> 7 <option value="S">S:600円</option> 8 <option value="L">L:900円</option> 9</select> 10<select class="children" id="number01" name="number01" disabled required> 11 <option value="0" class="msg" selected>0</option> 12 <option value="1" data-val="S">1</option> 13 <option value="2" data-val="S">2</option> 14 <option value="3" data-val="S">3</option> 15 <option value="4" data-val="S">4</option> 16 <option value="1" data-val="L">1</option> 17 <option value="2" data-val="L">2</option> 18 <option value="3" data-val="L">3</option> 19 <option value="4" data-val="L">4</option> 20 </select> 21<label class="color"> 22 <input type="checkbox" name="color" value="color01 on" onclick="connecttext('size02',this.checked);"> 2324</label> 25<select class="parent" id="size02" name="size02" disabled required> 26 <option value="" class="msg" disabled selected>サイズを選択</option> 27 <option value="S">S:600円</option> 28 <option value="L">L:900円</option> 29</select> 30<select class="children" id="number02" name="number02" disabled required> 31 <option value="0" class="msg" selected>0</option> 32 <option value="1" data-val="S">1</option> 33 <option value="2" data-val="S">2</option> 34 <option value="3" data-val="S">3</option> 35 <option value="4" data-val="S">4</option> 36 <option value="1" data-val="L">1</option> 37 <option value="2" data-val="L">2</option> 38 <option value="3" data-val="L">3</option> 39 <option value="4" data-val="L">4</option> 40</select> 41(残り4種類同様です)

js

1$(function() { 2 //セレクトボックスが切り替わったら発動 3 $('select#number').change(function() { 4 5 //選択したvalue値を変数に格納 6 var val = $(this).val(); 7 8 //選択したvalue値をp要素に出力 9 $('p#fee').text(val); 10 }); 11}); 12$(function() { 13 var $children = $('.children'); 14 var original = $children.html(); 15 16 $('.parent').change(function() { 17 var val1 = $(this).val(); 18 19 $children.html(original).find('option').each(function() { 20 var val2 = $(this).data('val'); 21 if (val1 != val2) { 22 $(this).not('optgroup,.msg').remove(); 23 } 24 }); 25 26 if ($(this).val() === '') { 27 $children.attr('disabled', 'disabled'); 28 } else { 29 $children.removeAttr('disabled'); 30 } 31 32 }); 33}); 34function connecttext( textid, ischecked ) { 35 // チェック状態に合わせて有効・無効を切り替える 36 document.getElementById(textid).disabled = !ischecked; 37} 38$("input[type=checkbox]").click(function(){ 39 var $count = $("input[type=checkbox]:checked").length; 40 var $not = $('input[type=checkbox]').not(':checked') 41 42 //チェックが3つ付いたら、チェックされてないチェックボックスにdisabledを加える 43 if($count >= 10) { 44 $not.attr("disabled",true); 45 }else{ 46 //3つ以下ならisabledを外す 47 $not.attr("disabled",false); 48 } 49});

試したこと

js

1$(function(){ 2 var value = 900; 3 var maxNum = 4; 4 var tagInput = $('#number01'); 5 var tagOutput = $('#jsPrice'); 6 tagInput.on('change', function() { 7 var str = $(this).val(); 8 9 if(num == 0) { 10 num = ''; 11 } else if (num > maxNum) { 12 num = maxNum; 13 } 14 $(this).val(num); 15 if(num != 0) { 16 var price = num * value; 17 tagOutput.val(price); 18 } 19 }); 20});

補足情報

色々と調べたのですが、
合計するだけならなんとか出来たのですが、
2種類の価格を振り分けて表示することがどうにもできません。
どなたか、ご教示のほど、お願いいたします。

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

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

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

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

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

m.ts10806

2018/12/25 05:06

現在のJavaScriptコードをご提示ください。
kei344

2018/12/25 05:14

コードブロックにはコード/エラーのみを入れるようにしてください。文章はコードブロック外にあるほうが読みやすいです。 また、ご自身で試されたコードを質問文に追記し、「何」が「どのように」わからないのか、コードのどの部分で詰まっているのかなどを具体的に追記されたほうが回答が望めると思います。
hit-machine

2018/12/25 05:47

mts10806 様、kei344 様、 早速のご返答ありがとうございます。 kei344 様のおっしゃる通りに書きたいのですが、 コードに対してどう詰まってるかもよく分かっていない状況です。 勉強不足でもうしわけございませんが、何卒よろしくお願い致します。
guest

回答4

0

ベストアンサー

セレクトボックスの

<option value="S">S:9,000円</option>
<option value="A">L:6,000円</option>

と、表示部分の

Sサイズ:合計▲▲枚 × 600円 = ▲,▲▲▲円

Lサイズ:合計▲▲枚 × 900円 = ▲,▲▲▲円

が、整合性が取れていないような気がしますがこんな感じで

javascript

1<script> 2$(function(){ 3 $('[name=color]').on('change',function(){ 4 $(this).closest('label').nextAll('.parent:eq(0),.children:eq(0)').prop('disabled',!$(this).prop('checked')); 5 }).trigger('change'); 6 $(':checkbox,select').on('change click',function(){ 7 var souryo=500; 8 var p_s=600; 9 var p_l=900; 10 var n_s=0; 11 var n_l=0; 12 $('.parent:not(:disabled):not(:has(option[value=""]:selected))').each(function(){ 13 if($(this).val()=="S") n_s+=parseInt($(this).next('.children').val()); 14 if($(this).val()=="A") n_l+=parseInt($(this).next('.children').val()); 15 }); 16 $('.s.maisu').text(n_s); 17 $('.l.maisu').text(n_l); 18 $('.s.kingaku').text(n_s*p_s); 19 $('.l.kingaku').text(n_l*p_l); 20 $('.all.kingaku').text(n_s*p_s+n_l*p_l+((n_s>0||n_l>0)?souryo:0)); 21 }).eq(0).trigger('change'); 22}); 23</script> 24<label class="color"><input type="checkbox" name="color" value="color01"></label> 25<select class="parent" name="size01"> 26 <option value="" class="msg" selected>サイズを選択</option> 27 <option value="S">S600</option> 28 <option value="A">L900</option> 29</select> 30<select class="children" name="number01"> 31 <option value="0" class="msg" selected>0</option> 32 <option value="1">1</option> 33 <option value="2">2</option> 34 <option value="3">3</option> 35 <option value="4">4</option> 36 </select><br> 37<label class="color"><input type="checkbox" name="color" value="color02"></label> 38<select class="parent" name="size02"> 39 <option value="" class="msg" selected>サイズを選択</option> 40 <option value="S">S600</option> 41 <option value="A">L900</option> 42</select> 43<select class="children" id="number02" name="number02"> 44 <option value="0" selected>0</option> 45 <option value="1">1</option> 46 <option value="2">2</option> 47 <option value="3">3</option> 48 <option value="4">4</option> 49</select><br> 50<label class="color"><input type="checkbox" name="color" value="color03"></label> 51<select class="parent" name="size02"> 52 <option value="" class="msg" selected>サイズを選択</option> 53 <option value="S">S600</option> 54 <option value="A">L900</option> 55</select> 56<select class="children" id="number02" name="number02"> 57 <option value="0" selected>0</option> 58 <option value="1">1</option> 59 <option value="2">2</option> 60 <option value="3">3</option> 61 <option value="4">4</option> 62</select><br> 63<label class="color"><input type="checkbox" name="color" value="color04"></label> 64<select class="parent" name="size02"> 65 <option value="" class="msg" selected>サイズを選択</option> 66 <option value="S">S600</option> 67 <option value="A">L900</option> 68</select> 69<select class="children" name="number02"> 70 <option value="0" selected>0</option> 71 <option value="1">1</option> 72 <option value="2">2</option> 73 <option value="3">3</option> 74 <option value="4">4</option> 75</select><br> 76<label class="color"><input type="checkbox" name="color" value="color05"></label> 77<select class="parent" name="size02"> 78 <option value="" class="msg" selected>サイズを選択</option> 79 <option value="S">S600</option> 80 <option value="A">L900</option> 81</select> 82<select class="children" name="number02"> 83 <option value="0" selected>0</option> 84 <option value="1">1</option> 85 <option value="2">2</option> 86 <option value="3">3</option> 87 <option value="4">4</option> 88</select><br> 89<label class="color"><input type="checkbox" name="color" value="color06"></label> 90<select class="parent" name="size02"> 91 <option value="" class="msg" selected>サイズを選択</option> 92 <option value="S">S600</option> 93 <option value="A">L900</option> 94</select> 95<select class="children" name="number02"> 96 <option value="0" selected>0</option> 97 <option value="1">1</option> 98 <option value="2">2</option> 99 <option value="3">3</option> 100 <option value="4">4</option> 101</select> 102<div id="result"> 103Sサイズ:合計<span class="s maisu">0</span>枚 × 600円 = <span class="s kingaku">0</span><br> 104Lサイズ:合計<span class="l maisu">0</span>枚 × 900円 = <span class="l kingaku">0</span><br> 105送料:500<br> 106合計:<span class="all kingaku">0</span>107</div>

投稿2018/12/25 07:00

yambejp

総合スコア114769

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

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

hit-machine

2018/12/25 07:13

ご回答ありがとうございます。 実際に作っているフォームの内容をそのまま出せなかったので、 ダミーで入れてたら、残ってしまっていました。 ご指摘ありがとうございます。 また、ご回答頂いた内容も試してみます。 後ほどご報告させていただきます。
hit-machine

2018/12/25 07:45

ありがとうございます! 理想通りのものができそうです! ちなみに、1つに数まで選択した後、 別の色でサイズを選択すると、それまでに選択した枚数が0に戻ってしまうのですが、 全ての親子クラスに同じ.parent .children を使用してるからなのでしょうか?
yambejp

2018/12/25 07:52

>ちなみに、1つに数まで選択した後、 >別の色でサイズを選択すると、それまでに選択した枚数が0に戻ってしまう あれ?そうですか? 一応こちらではちょこちょこっと動作確認したんですけど ブラウザの種類とバージョンとOSはなんでしょう?
hit-machine

2018/12/25 08:07

すみませんでした!前に書いていたjsのコードが残っていた様で、 それを消したら大丈夫でした。 お手数お掛けしました。 そして、本当に助かりました! ありがとうございました!
guest

0

jQuery

1 var cnt = { "S": 0, "L": 0 }; 2 $('[name="color"]:checked').parent().find('+ select:not(:disabled) + select.children option[data-val]:selected').each(function(index, element) { 3 cnt[$(element).attr('data-val')] += parseInt($(element).val(), 10); 4 }); 5 console.log(cnt);

投稿2018/12/25 06:55

x_x

総合スコア13749

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

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

x_x

2018/12/25 07:09

質問は計算ということなので、インターフェースの制御バグについては考慮していません。
hit-machine

2018/12/25 07:15

ご回答ありがとうございます。 すみません、あまり知識がないもので、 頂いた内容で出力しましたが、反映されませんでした。 もう少し試してみます。
x_x

2018/12/26 06:02

計算のみなので、画面への出力は自分で試してみてください
guest

0

金額の振り分け以前に $('.parent').change(function() {/* 略 */}); が正しく動作していないのでは? .parent が複数あり、.childrenも複数あるため、var original = $children.html();に最初の.childrenの内容しか入っていないのでは。

それぞれまとめてしまって、それをeachで処理するほうが良いのでは。

HTML

1<div class="select-wrap"> 2<select class="parent"></select> 3<select class="children"></select> 4</div>

js

1$( '.select-wrap' ).each( function() { 2 var $parent = $( '.parent', this ); 3 var $children = $( '.children', this ); 4 /* 略 */ 5} );

【.each() | jQuery API Documentation】
https://api.jquery.com/each/

計算についても同じです。

投稿2018/12/25 06:39

kei344

総合スコア69398

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

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

hit-machine

2018/12/25 06:59

ご回答ありがとうございます。 色もすべて表示させておかなければならないんです。 仕様としては、 「6色(実際はもっとあります)全て予約できるけど、サイズはどちらかしか選べない」 というフォームにしたいです。
kei344

2018/12/25 07:03

どちらにせよ最初のselect要素以外の書き換えに失敗していますよ、という回答です。
guest

0

data-valのSがSサイズ、AがLサイズってのでいいんですかね。
以下は動作確認していませんし、ちょっとイケてない書き方感ありますけど、
選択中項目に対して、val()での値取得と、data-valの値取得で振り分けすればいいのではないかという提案です。
※data-valの修正されたようなのでA→Lに変えました

jQuery

1var sizelistS = new Array(); 2var sizelistL = new Array(); 3 4//商品別の繰り返し開始 5cost = $("#number02 option:selected").val(); 6size = $("#number02 option:selected").data("val"); 7if(size == 'S'){ 8 sizelistS.push(cost) 9}else if(size == 'L'){ 10 sizelistL.push(cost) 11} 12//繰り返し終了 13 14//合計値取得 ※reduceに馴染みなければforでもどうぞ 15sumS = sizelistS.reduce((a,x) => a+=x,0); 16sumL = sizelistL.reduce((a,x) => a+=x,0); 17 18//あとはそれぞれの合計値を設定する 19

投稿2018/12/25 05:57

編集2018/12/25 05:59
mikan_s4n

総合スコア377

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

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

hit-machine

2018/12/25 07:02

ありがとうございます。 試してみてまたコメントさせて頂きます。 今のところ、合計値取得の部分の sumS = sizelistS の部分に、parenthesized pattern が表示されていて、 何だか分からずに詰まっております。
mikan_s4n

2018/12/25 07:15 編集

解析不能エラーですかね。正しくはParsing error: Parenthesized patternかな? 自分もまだ勉強中のとこですので、解決策の提示ができないですね…。 したいことは「配列内の合計値の取得」なので大人しくforで回したりする方がよいのかもしれません。 解決にならなくて申し訳ない 追記: 他の方がされているように取得した個数は「文字列」なので、parseIntで「数値」にした方がよいですね。forやforeachで回したりして合計値を算出する時は変換入れて下さい。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問