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

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

詳細はこちら
JavaScript

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

HTML

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

Q&A

1回答

2481閲覧

WEB上で自動見積できるサイトを作りたい

退会済みユーザー

退会済みユーザー

総合スコア0

JavaScript

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

HTML

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

0グッド

0クリップ

投稿2020/11/30 09:03

編集2020/11/30 09:46

■やりたい事

WEBサイト上で自動見積りを行えるようにしたい
各項目の数値を変更すると小計金額、合計金額が計算されるようにしたい

■問題点

https://www.mitsumori-js.com/
このサイトのテンプレートを使用して自動計算は出来るようになりました。

しかし、数量と単価をどちらも入力して小計がでるようにしたかったので
それぞれクラス名の語尾に「2」をつけ別のクラスを指定しました。

javaの29~41行にはもとのコードをコピーし、それぞれ語尾を「2」にしています。

また、それに対応した計算をするように、53,54行からコードをコピーし
javaの69、70行目に「text2-quantity」としたコードを追記しています。

結果、数量を変更したときには自動計算されるようになりましたが、

単価を変更したときには自動で計算されないという状態で困っています。

ご回答を頂けますでしょうか。

また、下記javascriptのコードは
文字数の関係で改変したコード上部の部分のみ記載しています。

該当のソースコード

html

1<div id="mitsumori"> 2 <table class="mitsumori-tbl"> 3 <thead> 4 <th>項目</th> 5 <th>数量</th> 6 <th>単位</th> 7 <th>単価</th> 8 <th>金額</th> 9 </thead> 10 <tbody> 11 <tr id="mitsumori-item-1" class="mitsumori-item" data-itemnum="1"> 12 <td class="item-name">見積項目1</td> 13 <td class="item-quantity">1</td> 14 <td class="item-unit"></td> 15 <td class="item-price0"> 16 <select class="select-price" data-itemnum="1"> 17 <option value=""></option> 18 <option value="10000">¥10,000</option> 19 <option value="20000">¥20,000</option> 20 </select> 21 </td> 22 <td class="item-price"><span></span></td> 23 </tr> 24 <tr id="mitsumori-item-2" class="mitsumori-item" data-itemnum="2"> 25 <td class="item-name">見積項目2</td> 26 <td class="item-quantity"><input type="text" class="text2-quantity" size="2" data-itemnum="2"></td> 27 <td class="item-unit"></td> 28 <td class="item-price0"> 29 <select class="select2-price" data-itemnum="2"> 30 <option value=""></option> 31 <option value="4000">¥4,000</option> 32 <option value="5000">¥5,000</option> 33 <option value="6000">¥6,000</option> 34 </select> 35 </td> 36 <td class="item-price"><span></span></td> 37 </tr> 38 </tbody> 39 </table> 40 <table class="mitsumori-total-tbl" data-taxflg="0"> 41 <tbody> 42 <tr><th>合計金額</th><td><span id="mitsumori-total"></span></td></tr> 43 </tbody> 44 </table> 45</div>

javascript

1"use strict"; 2 3window.onload = function() { 4 var textQuantityElems = document.querySelectorAll('#mitsumori .text-quantity'); 5 textQuantityElems = Array.prototype.slice.call(textQuantityElems, 0); 6 textQuantityElems.forEach(function (textQuantityElem, textQuantityIndex) { 7 if (textQuantityElem.value!='') textQuantityElem.value=''; 8 textQuantityElem.addEventListener('keyup', calcPrice, false); 9 textQuantityElem.addEventListener('blur', calcPrice, false); 10 }); 11 var radioQuantityElems = document.querySelectorAll('#mitsumori .radio-quantity'); 12 radioQuantityElems = Array.prototype.slice.call(radioQuantityElems, 0); 13 radioQuantityElems.forEach(function (radioQuantityElem, radioQuantityIndex) { 14 if (radioQuantityElem.checked) radioQuantityElem.checked=false; 15 radioQuantityElem.addEventListener('change', calcPrice, false); 16 }); 17 var checkQuantityElems = document.querySelectorAll('#mitsumori .check-quantity'); 18 checkQuantityElems = Array.prototype.slice.call(checkQuantityElems, 0); 19 checkQuantityElems.forEach(function (checkQuantityElem, checkQuantityIndex) { 20 if (checkQuantityElem.checked) checkQuantityElem.checked=false; 21 checkQuantityElem.addEventListener('change', calcPrice, false); 22 }); 23 var selectQuantityElems = document.querySelectorAll('#mitsumori .select-price'); 24 selectQuantityElems = Array.prototype.slice.call(selectQuantityElems, 0); 25 selectQuantityElems.forEach(function (selectQuantityElem, selectQuantityIndex) { 26 selectQuantityElem.selectedIndex=0; 27 selectQuantityElem.addEventListener('change', calcPrice, false); 28 }); 29 var text2QuantityElems = document.querySelectorAll('#mitsumori .text2-quantity'); 30 text2QuantityElems = Array.prototype.slice.call(text2QuantityElems, 0); 31 text2QuantityElems.forEach(function (text2QuantityElem, textQuantityIndex) { 32 if (text2QuantityElem.value!='') text2QuantityElem.value=''; 33 text2QuantityElem.addEventListener('keyup', calcPrice, false); 34 text2QuantityElem.addEventListener('blur', calcPrice, false); 35 }); 36 var select2QuantityElems = document.querySelectorAll('#mitsumori .select2-price'); 37 select2QuantityElems = Array.prototype.slice.call(select2QuantityElems, 0); 38 select2QuantityElems.forEach(function (select2QuantityElem, selectQuantityIndex) { 39 select2QuantityElem.selectedIndex=0; 40 select2QuantityElem.addEventListener('change', calcPrice, false); 41 }); 42 43 function calcPrice() { 44 var subtotal = 0, 45 tax = 0, 46 total = 0, 47 itemNum = event.target.getAttribute('data-itemnum'), 48 taxFlg = parseInt(document.querySelector('.mitsumori-total-tbl').getAttribute('data-taxflg')), 49 items = document.querySelectorAll('.mitsumori-item'); 50 items = Array.prototype.slice.call(items, 0); 51 items.forEach(function (itemElem, itemIndex) { 52 if (itemElem.getAttribute('data-itemnum') == itemNum) { 53 if (event.target.classList.contains('text-quantity')) { 54 itemElem.querySelector('.item-price span').textContent = escapeHtml(event.target.value) * escapeHtml(itemElem.querySelector('.unit-price').value); 55 } else if (event.target.classList.contains('radio-quantity')) { 56 itemElem.querySelector('.item-price span').textContent = escapeHtml(event.target.value); 57 } else if (event.target.classList.contains('check-quantity')) { 58 var checkLabels = itemElem.querySelectorAll('.check-quantity'); 59 var _total = 0; 60 checkLabels = Array.prototype.slice.call(checkLabels, 0); 61 checkLabels.forEach(function (checkLabelElem, checkLabelIndex) { 62 if (checkLabelElem.checked) { 63 _total += parseInt(escapeHtml(checkLabelElem.value)); 64 } 65 }); 66 itemElem.querySelector('.item-price span').textContent = _total; 67 } else if (event.target.classList.contains('select-price')) { 68 itemElem.querySelector('.item-price span').textContent = escapeHtml(itemElem.querySelector('.select-price').value); 69 } else if (event.target.classList.contains('text2-quantity')) { 70 itemElem.querySelector('.item-price span').textContent = escapeHtml(event.target.value) * escapeHtml(itemElem.querySelector('.select2-price').value); 71 } 72 } 73 if (itemElem.querySelector('.item-price span').textContent != '') { 74 subtotal += parseInt(itemElem.querySelector('.item-price span').textContent); 75 } 76 });

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

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

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

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

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

gentaro

2020/11/30 09:25

ここはコード載せたら誰かが勝手に手伝ってくれるサイトじゃないんで、あなたがそのコードのどの部分をどのように意図してプログラミングし、具体的にどのあたりの箇所が上手く行かないのかなど、ちゃんと説明してください。 これだけだとただの丸投げです。
退会済みユーザー

退会済みユーザー

2020/11/30 09:47

gentaro様 コメントありがとうございます。 質問内容を修正させていただきました。 ご回答頂けると、幸いです。
hentaiman

2020/11/30 09:51

そういう指摘じゃないと思いますよ。 掲載しているjavascriptのコードを上から順にどんな処理しているか説明出来ますか? 最低限そうでなければ丸投げです。 ちゃんと理解して説明出来るのなら、期待通りの動作にならない個所のみをピンポイントで質問出来るはずです。 ピンポイントで質問出来れば丸投げという判断も消えて回答も付くものと思われます。
miyabi_takatsuk

2020/11/30 09:56

退会してしまいましたか・・・。
guest

回答1

0

対象となる第2TD要素の子は必ずinput要素にすること。
変更されることが嫌ならreadonly属性でもつけること。
合計は、tfoot 要素がよいのではないだろうか?

js

1function calcPrice () { 2 let 3 tbody = mitsumori.querySelector ('table tbody'), 4 suuryou = tbody.querySelectorAll ('tr td:nth-of-type(2) input'), 5 tanka = tbody.querySelectorAll ('tr td:nth-of-type(4) select'), 6 kingaku = tbody.querySelectorAll ('tr td:nth-of-type(5) span'), 7 mTotal = document.querySelector ('#mitsumori-total'), 8 total = [...kingaku].reduce ((total, e, i)=> { 9 let p = Number (suuryou[i].value) * Number (tanka[i].value); 10 e.textContent = p; 11 return total + p; 12 }, 0); 13 14 mTotal.textContent = total; 15} 16 17calcPrice(); 18mitsumori.addEventListener ('change', calcPrice, true); 19mitsumori.addEventListener ('input', calcPrice, true); 20

投稿2020/11/30 10:06

babu_babu_baboo

総合スコア616

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問