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

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

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

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

2回答

1311閲覧

同じ計算処理をまとめたい

shiuri

総合スコア2

JavaScript

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

2クリップ

投稿2021/06/28 14:44

編集2021/06/30 13:08

javascriptで計算フォームを作成しております。
複数あるvalue(品物の単価)の合計がsyoukeiに出るようにしています。
forでまとめたいのですが、上手くいきません。
初心者で恐縮ですが、ご教示のほどよろしくお願いいたします。

追記 下記のjavascriptは綺麗に動いた例ですが、品物が増えるとその分追記しなくてはならないため、纏められないかと思いご質問させていただきました。

javascript

1$(document).ready(function(){ 2 $('select').change(function() { 3 var syoukei0= document.getElementsByName("syoukei0").value; 4 syoukei0=0; 5 $(".value0 input:text").each(function(){ 6 var value0 = $(this).val(); 7 syoukei0 = parseInt(value0)+syoukei0; 8 }); 9 document.form.syoukei0.value = syoukei0; // 合計を表示 10 }); 11}); 12 13$(document).ready(function(){ 14 $('select').change(function() { 15 var syoukei1= document.getElementsByName("syoukei1").value; 16 syoukei1=0; 17 $(".value1 input:text").each(function(){ 18 var value1 = $(this).val(); 19 syoukei1 = parseInt(value1)+syoukei1; 20 }); 21 document.form.syoukei1.value = syoukei1; // 合計を表示 22 }); 23}); 24 25$(document).ready(function(){ 26 $('select').change(function() { 27 var syoukei2= document.getElementsByName("syoukei2").value; 28 syoukei2=0; 29 $(".value2 input:text").each(function(){ 30 var value2 = $(this).val(); 31 syoukei2 = parseInt(value2)+syoukei2; 32 }); 33 document.form.syoukei2.value = syoukei2; // 合計を表示 34 }); 35});

HTMLも追記いたします。
他のscriptもありclassが乱立していますが、今回の質問では商品1~3横のinputに各商品の小計を入れることだけを目的としているためほかのscrptは記載はしておりません。必要であれば記載させていただきます。

HTML

1<form method="post" name="form"> 2<table border="1"> 3<tr> 4<th>詳細</th> 5<th>単価</th> 6<th>数量</th> 7<th>金額</th> 8</tr> 9 10<tr class="title"><td colspan="4">商品1<input type="text" name="syoukei0" class="syoukeis" value="0" disabled></td></tr> 11<tr class="rows"> 12 <td></td> 13 <td class="tanka" >440円</td> 14 <td><select name="goods1"> 15 <option value="0" selected>0</option> 16 <option value="1">1</option> 17 </select></td> 18 <td class="value0"><input type="text" class="price" size="7" value="0"> 円</td> 19</tr> 20<tr class="title"><td colspan="4">商品2<input type="text" name="syoukei1" class="syoukeis" value="0" disabled></td></tr> 21<tr class="rows"> 22 <td></td> 23 <td class="tanka" >440円</td> 24 <td><select name="goods2"> 25 <option value="0" selected>0</option> 26 <option value="1">1</option> 27 </select></td> 28 <td class="value1"><input type="text" class="price" size="7" value="0"> 円</td> 29</tr> 30 31<tr class="title"><td colspan="4">商品3<input type="text" name="syoukei2" class="syoukeis" value="0" disabled></td></tr> 32<tr class="rows"> 33 <td><font color="red">キャラ1</font></td> 34 <td class="tanka">605円</td> 35 <td ><select name="goods3"> 36 <option value="0" selected>0</option> 37 <option value="1">1</option> 38 </select></td> 39 <td class="value2"><input type="text" class="price" size="7" value="0"> 円</td> 40</tr> 41<tr class="rows"> 42 <td><font color="blue">キャラ2</font></td> 43 <td class="tanka" >605円</td> 44 <td ><select name="goods4"> 45 <option value="0" selected>0</option> 46 <option value="1">1</option> 47 </select></td> 48 <td class="value2"><input type="text" class="price" size="7" value="0"> 円</td> 49</tr> 50<tr class="rows"> 51 <td><font color="yellow">キャラ3</font></td> 52 <td class="tanka" >605円</td> 53 <td ><select name="goods5"> 54 <option value="0" selected>0</option> 55 <option value="1">1</option> 56 </select></td> 57 <td class="value2"><input type="text" class="price" size="7" value="0"> 円</td> 58</tr> 59<a name="top"></a> 60<tr > 61 <td colspan="3" > 62 <button type="button" id="hide">0円を非表示</button>  合計</td> 63 <td><a name="top"></a><input type="text" id="total" size="7" value="0"> 円</td> 64</tr> 65<tr> 66 <td colspan="3" >特典</td> 67 <td><input type="text" id="tokuten" size="7" value="0"> 枚</td> 68</tr> 69</table>

追記 試したこと

見よう見まねでやろうとしましたが、上手く動かなかったのでご質問した次第でございます。

$(document).ready(function(){ $('select').change(function() { var syoukei= document.getElementsByName('[name^="syoukei"]').value; for( i = 0; i < syoukei.length; i++ ) { syoukei[ i ]=0; $(".value[ i ] input:text").each(function(){ var value[ i ] = $(this).val(); syoukei[ i ] = parseInt(value[ i ])+syoukei[ i ]; }); document.form.syoukei[ i ].value = syoukei[ i ]; // 合計を表示 }); }); });

さらに追記 ご指摘を受けて

ご指摘を受け変更したのですが、上手く動きませんでした。(合計値が出されなかった)
どこにミスがあるかご教示いただけますと幸いです。

Javascript

1$(document).ready(function(){ 2 $('select').change(function() { 3 var syoukei= document.querySelectorAll('[name^="syoukei"]'); 4 for( i = 0; i < syoukei.length; i++ ) { 5 syoukei[ i ]=0; 6 $(".value"+i+" input:text").each(function(){ 7 var value[ i ] = $(this).val(); 8 syoukei[ i ] = parseInt(value[ i ])+syoukei[ i ]; 9 }); 10 document.form.syoukei[ i ].value = syoukei[ i ]; // 合計を表示 11 }); 12}); 13}); 14

さらに追記 2つめの回答を受けて

素人考えでいじった結果となります。
お手数おかけしますがよろしくお願いいたします。

$(document).ready(function(){ $('select').change(function() { // 金額入力欄をquerySelectorAllでまとめて取ってくる let priceList = document.querySelectorAll('.price'); priceList.forEach( e => { // 各金額入力欄の対し、予めセットしている小計対象のname値を取得 let targetSyoukeiClass = e.dataset.syoukei; // querySelectorで小計を加算するinputを特定 let targetSyoukeiInput = document.querySelector(`input[name=${targetSyoukeiClass}]`); // 無事取得できたら、小計inputに金額を加算する targetSyoukeiInput.value = 0; if(targetSyoukeiInput){ targetSyoukeiInput.value = Number(targetSyoukeiInput.value) + Number(e.value); } }); }); }); コード

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

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

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

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

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

m.ts10806

2021/06/28 21:29

「うまくいかない」などで伝わる情報量はゼロなので 具体的に起きている現象を記載してください。 https://teratail.com/help/question-tips#questionTips3-4-1 あと、HTMLも提示されないと再現確認および調整ができません。 JavaScriptだけ直したところで要件通り動くかは別問題です。 リファクタリングしたいのでしたらHTMLから全体を見て検討する必要があります。
guest

回答2

0

$(".value[ i ] input:text")

これだとiがiという文字列になってます。
変数として文字列連結してください。

js

1$(".value"+i+" input:text")

あと、getElement s By Nameなのでnameだけを指定するためname=は不要な上に複数(リスト)で取得されます。
セレクタで指定したいならこちら
そして、いきなりvalueにはアクセスできません。(参考
ループしてここに取り出す必要があります。

ただ、jQueryとVanillaJSが混ざってるので特にセレクタ部分は統一されたほうが良いです(結果は同じ)。

js

1document.querySelectorAll('[name^="syoukei"]') 23$('[name^="syoukei"]')

投稿2021/06/29 00:31

m.ts10806

総合スコア80875

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

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

shiuri

2021/06/29 12:34

```Javascript $(document).ready(function(){ $('select').change(function() { var syoukei= document.querySelectorAll('[name^="syoukei"]'); for( i = 0; i < syoukei.length; i++ ) { syoukei[ i ]=0; $(".value"+i+" input:text").each(function(){ var value[ i ] = $(this).val(); syoukei[ i ] = parseInt(value[ i ])+syoukei[ i ]; }); document.form.syoukei[ i ].value = syoukei[ i ]; // 合計を表示 }); }); }); ``` ご指摘通りに変更したのですが、動きませんでした… どの部分が足りないのでしょうか… 度々申し訳ございません。
shiuri

2021/06/29 12:36

ごめんなさい、Javascriptが貼り付けできると思っていました。 元の質問に追記します。
guest

0

ベストアンサー

HTML側をいじる案なので実現可能性は状況次第だと思いますが、私なら各金額入力欄に商品を特定できるカスタムデータ属性を付与します。
具体的には、商品1の金額入力欄であれば、以下の様に data-syoukeiを追加します。

html

1<input type="text" class="price" size="7" value="440" data-syoukei="syoukei0">

data-syoukeiの値は商品の小計を入れるinputのname属性の値と同じです。
これを全てのinput.priceに付与して、以下のスクリプトを実行すると小計を積算できます。

js

1// 金額入力欄をquerySelectorAllでまとめて取ってくる 2let priceList = document.querySelectorAll('.price'); 3priceList.forEach( e => { 4 // 各金額入力欄の対し、予めセットしている小計対象のname値を取得 5 let targetSyoukeiClass = e.dataset.syoukei; 6 // querySelectorで小計を加算するinputを特定 7 let targetSyoukeiInput = document.querySelector(`input[name=${targetSyoukeiClass}]`); 8 // 無事取得できたら、小計inputに金額を加算する 9 if(targetSyoukeiInput){ 10 targetSyoukeiInput.value = Number(targetSyoukeiInput.value) + Number(e.value); 11 } 12});

codepenでのデモ
(デモのため各明細の金額は予め入れてあります)

この問題で大変なのは金額inputに対応する小計inputを紐づけることなので、その紐づけをカスタムデータ属性でやってしまおうということです。

投稿2021/06/29 19:24

hope_mucci

総合スコア4447

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

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

shiuri

2021/06/30 13:05

ご回答とデモの記載もありがとうございます。 動かしてみた結果、期待通りの動きをしたのですが、今回selectを動かしたときに実行されるようにしたかったため、 $(document).ready(function(){ $('select').change(function() { を追記しました。 その結果select選択で加算されるようになったのですが、selectを0に戻す(inputは440のまま)→1にする(inputは880と記載される)というどんどん加算されるだけの動きになってしまいました。 そこで、一旦0にリセットすればいいだろうと考え、 targetSyoukeiInput.value = 0; をifの前に追加しましたら、単品商品(商品1、商品2)はうまく動いたのですが、複数商品(商品3)は最後尾の値のみ反映されるようになってしまいました。 0にリセット→1つ目のdata-syoukei="syoukei0"の値を取得→0にリセット→2つ目 というループになってしまったんだろうと想像はつきますが、どうすればよろしかったのでしょうか。 現時点のscriptを本文に貼り付けしますので、恐縮ですがご確認いただけますと幸いです。 よろしくお願いいたします。
hope_mucci

2021/06/30 15:18

計算の最初に小計欄を全部ゼロにすれば良いのではないでしょうか。 小計inputは全てsyoukeisクラスがついているようなので、 document.querySelectorAll('.syoukeis').forEach( e => { e.value = 0; }); codepen反映済みです。
shiuri

2021/07/01 13:49

無事に解決いたしました。 本当にありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問