保持给定HTML编号字段中的数字总和

时间:2017-12-12 07:51:26

标签: jquery math

让我们以库存的比喻来讨论这个问题,比如我收到一个SKU的20个单位的库存,现在我有三个仓库,我想分发这个库存,每个仓库都有数字字段在他们面前。

Warehouse1  [ 20^] <-- this is html number field and 20 is assigned to first warehouse by default
Warehouse2  [   ^]
Warehouse2  [   ^]

现在,如果用户将仓库2的值更改为10,则仓库1的值应更改为10.如果用户将5放入仓库3,则应在仓库1或仓库2中进行调整。

以下是我正在尝试的代码

    function recalculateStockAssignment(ele) {
        var prev_val = parseFloat(jQuery(ele).data('prev'));
        var dif = prev_val - parseFloat(jQuery(ele).val());
        jQuery("input[name='" + jQuery(ele).prop('name') + "']").not(ele).each(
                function () {
                    if (jQuery(this).val() > 0 && dif < 0)
                    {
                        var val = parseFloat(jQuery(this).val()) + parseFloat(dif);
                        console.log("difference is minus", val);
                        jQuery(this).val(parseFloat(val));
                    } else
                    {
                        var val = parseFloat(jQuery(this).val()) + parseFloat(dif);
                        console.log("difference is positive", val);
                        if( parseFloat(jQuery) )
                        jQuery(this).val(parseFloat(val));
                    console.log(this);

                    }
                });
                jQuery(ele).data('prev', jQuery(ele).val());
            }

这没有按预期工作,我感觉有些专业人士可以提出更简单的解决方案。

非常感谢您的帮助,谢谢

1 个答案:

答案 0 :(得分:0)

这应该涵盖您的问题或至少让您走上正确的轨道 - 确保设置total_stock变量。此解决方案适用于整数值:

   var total_stock = 20
   $(document).ready(function(){
      
    
      $(".warehouse").on("change",function(){
         recalculateStockAssignment($(this))
      })
   })
   
   function recalculateStockAssignment(ele) {
       if(ele.val() > total_stock){
         ele.val(total_stock)
       }
       var changed_val = ele.val()
       var cur_id = ele.prop('id')
       var temp_total = 0
       $(".warehouse").each(function(){
          temp_total+=parseInt($(this).val())
       })
       var diff =   total_stock - temp_total
       
       
       $(".warehouse").each(function(){
          
          if($(this).prop('id')!=cur_id){
             var val=parseInt($(this).val())
             if(val+diff > 0){
                $(this).val(parseInt(val)+parseInt(diff))
                diff=0
             }else{
               $(this).val(0)
               diff=parseInt(val)+parseInt(diff)
             }
          }
       })
       
   }
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input type="number" id="w1" class="warehouse" value="20">
<input type="number" id="w2" class="warehouse" value="0">
<input type="number" id="w3" class="warehouse" value="0">