【Laravel5.8】2つのFormを使ってリアルタイム計算をしたい
2つのFormを使ってリアルタイム計算をしたい。
使用するのはjQuery。
数量(quantity)と単価(bill_unit_price)が、
<td><span class="ans"></span></td>
に出てくる感じで。
<!--数量--> <td><input type="text" name="quantity[]" value="{{$val->quantity}}" class="validate quantity" id="quantity"></td> <!--単価--> <td><input type="text" name="bill_unit_price[]" value="{{ceil($val->bill_unit_price)}}" class="validate bill_unit_price" id="bill_unit_price"></td> <!--金額--> <td><span class="ans"></span></td>
$(".quantity,.bill_unit_price").on('keyup',function() { var $_t = $( this ).parent().parent(); var quantityVal = $_t.find( '.quantity' ); var num01 = isNaN(quantityVal.val()) ? 0 : quantityVal.val(); var bill_unitVal = $_t.find( '.bill_unit_price' ); var num02 = isNaN(bill_unitVal.val()) ? 0 : bill_unitVal.val(); var sum = num01 * num02; $_t.find('.ans').html(sum);
三項演算子で数字かどうかを確かめて、数字以外が入ったら0を出すようにしています。
isNaN(quantityVal.val()) ? 0 : quantityVal.val();
難しかったのは、
var $_t = $( this ).parent().parent();
あたり。その辺は、以下の説明を参考にします。
まずvar $_t = $( this ).parent();の部分ですが、ここで取得できているタグはtdタグになります。
例えばquantityを変更したときにとれるのは、input quantityを囲っているtdタグになります。
ですから、書かれているコードのbill_unitValをfindしにいっても、該当のtdタグの中には存在しないのでそもそもbill_unitValの要素を取得できません。
対策はvar $_t = $( this ).parent().parent();として、さらなる親要素を検索開始の位置にしてやることです。
ただそれだけでは、ansのクラスを持つタグの中身を書き換えるようになっているため、関係ない行の値まで書き換わってしまうようになります。
この対策は、$_tをそれぞれのレコードのルート要素として取得しているので、ansについても$_t.find(‘.ans’).html(sum);のように、起点からfindを使って影響範囲を絞ることで解決できるでしょう。
引用:
https://qa.sejuku.net/questions/1117/