■やりたい事
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 });