【问题标题】:I need to add together multiple inputs, which are read only totals of 2 other inputs我需要将多个输入相加,这些输入是 2 个其他输入的只读总计
【发布时间】:2017-04-18 13:41:54
【问题描述】:

我需要帮助,基本上将总输入加在一起,以使它们加在一起以创建最终数量。

如上图所示,可以有多个输入,点击按钮可以添加更多,代码可以工作,所以数量和单价相加,但是我在小计之后自动相加以不断更新 gbp 总量。

<table>
  <tr>
    <td>
      <input type="number" oninput="calculate(this)" id="qid1" data-quantity name="qamount" min="0" data-validation="number" class="qinput txt" value="{{Quantity}}" />
    </td>
    <td>
      <input type="text" data-validation="length" data-validation-length="max100" class="dinput" value="{{Details}}" />
    </td>
    <td>
      <input type="number" oninput="calculate(this)" id="uid1" data-unitprice name="uamount" min="0" data-validation="number" data-validation-allowing="float" class="uinput txt" value="{{UnitPrice}}" />
    </td>
    <td>
      <input readonly id="subsubtotal" name="totalamount" class="sinput txt" value="{{Subtotal}}" />
    </td>
  </tr>
</table>

<div class="additembtton">
  <button id="bttonitem">Add Invoice Item</button>
  <input id="bttonitem1" type="submit" value="Save" />
  <span class="gbptotal">GBP Total</span>
  <span id="totalplus" class="totalsub">£0.00</span>
</div>

JS

//code that multiplies the quantity and unit price input boxes
function calculate(obj) {
    var tr = obj.parentNode.parentNode;
    var myBox1 = tr.cells[0].children[0].value;
    var myBox2 = tr.cells[2].children[0].value;
    var result = tr.cells[3].children[0];
    var myResult = parseFloat(myBox1) * parseFloat(myBox2);
    result.value = myResult.toFixed(2);
}

上面的javascript已经可以工作了,这将数量和单价相乘,我正在努力解决如何对小计做同样的事情,将所有小计加在一起(不管有多少) ,并在 £0.00 所在的位置显示最终总数。

【问题讨论】:

  • 您的用户可以订购商品的小部分吗?这与您的问题完全无关,但从 UI 的角度来看,小数似乎不太可能要求。 :) 哦,你真的在​​使用 jQuery 吗?这绝不是必需的,如果它没有在其他地方使用,似乎是多余的。
  • 是的,是的:))

标签: javascript jquery input addition


【解决方案1】:
<input id="bttonitem1" type="submit" value="Save" onclick="gbpTotal()">

function gbpTotal(){

    var total = 0;

    var inputs = document.querySelectorAll('.sinput');

    inputs.forEach(function(e){

        total += parseFloat(e.value);

    });

    document.querySelector('#totalplus').textContent = total;

};

您可能希望在他们点击输入而不是保存时触发该功能

【讨论】:

  • 感谢您抽出宝贵时间回复,这影响了它,但它只是将 0.00 英镑更改为 NaN,然后​​它没有做任何事情,会玩一下看看是什么跨度>
  • 当有人多次计算同一行时,我的解决方案没有考虑在内,这会导致该小计出现两次下降,但我会修改我的答案以适应这一点,片刻.
  • @JacobHarrison 在我的回答中查看编辑,应该可以。
  • 这确实会再次影响总数,但是它不是将小计加在一起,而是将每个输入的总数分别显示在彼此旁边。看起来像这样(当每个小计框中的总数为144时)144.00144.00,而不是将它们加在一起,谢谢您的帮助,也可以玩一下,看看我是否可以排序跨度>
  • @JacobHarrison 看看我的回答,我添加了一个parseFloat() 来强制输入一个数字,因为发生的事情是值作为字符串传递,并且它们像你看到的那样连接起来,但是现在它应该是一个可以进行加法的数字。
【解决方案2】:

您需要在汇总时查询来自同一列的所有输入。这最好通过确保每列中的输入属于同一个 CSS 类来实现。这样一来,您最终得到多少行都没有关系,您不必担心行或单元格,只需考虑属于同一类的输入即可。

因此,这里有一个示例说明如何获取总列的总数,但相同的方法将用于任何其他列。

var totals = document.querySelectorAll(".total");
var output = document.getElementById("total");
var btn = document.querySelector("button");

btn.addEventListener("click", function(){
  
  var tot = null;
  // Convert the node list of inputs that hold totals into an array and loop through that array
  Array.prototype.slice.call(totals).forEach(function(element){
    // Get the sum of the values
    tot += parseFloat(element.value);
  });
  
  // Display the output
  output.textContent = tot;

});
<table>
  <thead>
    <tr>
      <th>Name</th>
      <th>Price</th>
      <th>Quantity</th>  
      <th>Total</th>    
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><input type="text" class="name"></td>
      <td><input type="text" class="price"></td>
      <td><input type="text" class="qty"></td>  
      <td><input type="text" class="total"></td>    
    </tr>  
    <tr>
      <td><input type="text" class="name"></td>
      <td><input type="text" class="price"></td>
      <td><input type="text" class="qty"></td>  
      <td><input type="text" class="total"></td>    
    </tr>  
    <tr>
      <td><input type="text" class="name"></td>
      <td><input type="text" class="price"></td>
      <td><input type="text" class="qty"></td>  
      <td><input type="text" class="total"></td>    
    </tr>      
  </tbody>
</table>
<div id="total"></div>
<button>Get Totals</button>

【讨论】:

  • 用 reduce 代替 forEach 可能吗?
  • @FrankCamara 当然。但是,那部分并不是真正的问题。
  • 也谢谢你,试一试,感谢回复
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-09-07
  • 1970-01-01
  • 1970-01-01
  • 2021-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多