1

我想通過乘以單個行的輸入來計算每行的總價格,然後通過使用JQuery添加Total列的所有總值來計算總計。當我輸入值時,我只得到第一行來顯示總數。任何幫助將不勝感激。JQuery乘以表格行的輸入值

 <script type="text/C#" src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script> 
    <script type="text/javascript"> 
     $(document).ready(function() { 
      $(".txtMult").each(function() { 
       $(this).keyup(function() { 
        multInputs(); 
       }); 
      }); 
      }); 

      function multInputs() { 
       var mult = 0; 
       $(".txtMult").each(function() { 
        var $val1 = $('#val1').val(); 
        var $val2 = $('#val2').val(); 
        var $total = ($val1 * 1) * ($val2 * 1) 
        $('#multTotal').text($total); 
       }); 
      } 

    </script> 
    @using (@Html.BeginForm()) 
    { 
     <table> 
     <tr> 
      <th> 
       Quanity 
      </th> 
      <th> 
       Unit Price 
      </th> 
      <th> 
       Total 
      </th> 
     </tr> 
     @for (int i=0; i < 5; i++) 
     { 

      <tr> 
       <td> 
        <input class ="txtMult" name="txtEmmail" id="val1" /> 
       </td> 
       <td> 
        <input class ="txtMult" name="txtEmmail" id="val2"/> 
       </td> 
       <td> 
        <span id="multTotal">0.00</span> 
       </td> 
      </tr> 

    } 
<tr> 
    <td colspan="3" align="right"> 
     Grand Total# <span id="grandTotal">0.00</span> 
    </td> 
</tr> 
    </table> 
    } 

enter image description here

回答

8

你的HTML是無效:id屬性應該是唯一的,但你是重複的每一行中相同的三個ID。解決這個問題的最簡單方法是將您的輸入更改爲class="val1"class="val2",而不是id="val1"`id="val2",並將您的行總數更改爲class="multTotal"。我還動txtMult類每一個與他們輸入的TR元素,爲便於選擇這些行:

 <tr class="txtMult"> 
      <td> 
       <input name="txtEmmail" class="val1" /> 
      </td> 
      <td> 
       <input name="txtEmmail" class="val2"/> 
      </td> 
      <td> 
       <span class="multTotal">0.00</span> 
      </td> 
     </tr> 

...然後在你的jQuery代碼通過類來選擇改變選擇在當前行的上下文中。還要注意的是,你並不需要一個.each()循環到.keyup()處理程序綁定到你的選擇相匹配的元素,只要使用$("someselector").keyup()

$(document).ready(function() { 
     $(".txtMult input").keyup(multInputs); 

     function multInputs() { 
      var mult = 0; 
      // for each row: 
      $("tr.txtMult").each(function() { 
       // get the values from this row: 
       var $val1 = $('.val1', this).val(); 
       var $val2 = $('.val2', this).val(); 
       var $total = ($val1 * 1) * ($val2 * 1); 
       // set total for the row 
       $('.multTotal', this).text($total); 
       mult += $total; 
      }); 
      $("#grandTotal").text(mult); 
     } 
    }); 

工作演示:http://jsfiddle.net/nnnnnn/5FpWC/

+0

我想我不能使用兩個類o n相同的輸入最好的解決辦法是什麼? – antar 2012-08-03 05:36:30

+0

感謝您的幫助! :) – antar 2012-08-03 05:43:49

+0

您可以在同一元素上使用兩個或多個類,只需在單個'class'屬性中用空格分隔類名即可:''。但請注意,在我的解決方案中,我從輸入中移除了'txtMult'類,並將它放在tr元素上(您仍然可以通過使用'tr.txtMult input'選擇器來定位樣式表中的輸入 - 它會顯示'select any輸入是具有「txtMult」類的tr元素的後代)。 – nnnnnn 2012-08-03 05:44:56

1

讓我們添加一個類in到表。

首先向表格的所有輸入添加一個更改事件。在輸入欄的變化乘以同一行的所有輸入和更新multTotalgrandTotal

$(function(){ 
      $('.in input').change(function(){ 
       var p=$(this).parent().parent() //get the parent of changed input 
       var m=p.find('input.txtMult') //find all input of the row 
       var mul=parseFloat($(m[0]).val()*$(m[1]).val()).toFixed(2) //multiply them 
       var res=p.find('.multTotal') // get corresponding multTotal 
       res.html(mul); //show the result 
       var total=0; 
       $('.in .multTotal').each(function(){ 
        total+=parseFloat($(this).html()) 
       }) //calculate grand total 
       $('.in #grandTotal').html(parseFloat(total).toFixed(2)) //show grand total 
      }); 
     }) 

檢查這在jsfiddle

如果需要處理超過2場改變

var mul=parseFloat($(m[0]).val()*$(m[1]).val()).toFixed(2) //multiply them 

var mul=1; 
$(m).each(function(){ 
    mul*=$(this).val() 
}) 
mul=parseFloat(mul).toFixed(2) 
+0

感謝您的回答。工作很棒! – antar 2012-08-03 06:01:15

+1

請注意,對於已經是數字的事物,您不需要'parseFloat()',也就是說,您不需要在'total'變量上使用它,並且您不需要在'$(m [0])。val()* $(m [1])。val()'因爲'*'運算符將兩個操作數轉換爲數字。 – nnnnnn 2012-08-03 06:08:13

+1

你是對的總。但當給定的輸入是整數時,解析$(m [0]).val()* $(m [1]).val()'以顯示結果最多兩位小數點。 – Sarowar 2012-08-03 06:17:11