2015-06-30 70 views
0

我想从表单字段数组中获取总值,但由于某种原因,Keyup上的值不正确最后一个值从最后一个输入值中增加而并非所有字段都是我的功能:Jquery函数循环增加值

function percentage_hardcoded_form(_formharcoded_id, _form_fieldArray, _form_hardcodedtotalWrapper, _form_hardcodedtotalId) { 

      var _form   = $j(_formharcoded_id); 
      var _sumDisplay  = _form.find(_form_hardcodedtotalId); 

      $j(_form_hardcodedtotalId).attr('disabled','disabled'); 


      $j.each(_form_fieldArray, function(index, item) { 

       var _summands  = item; 
       var sum    = 0; 

       _form.delegate(_summands, 'change', function() { 

        //$j.each(function() {  
         var value = Number($j(this).val()); 
         if (!isNaN(value) && !$j(this).is(_form_hardcodedtotalId)) sum += value; 
        //}); 

        if(sum === 100) 
        { 
         // is 100 
         $j(_form_hardcodedtotalWrapper).removeClass('warning'); 
         $j(_form_hardcodedtotalWrapper).find('.QuestionWarning').hide(); 
        } 
        else 
        { 
         // isnt 100 
         $j(_form_hardcodedtotalWrapper).addClass('warning'); 
         $j(_form_hardcodedtotalWrapper).find('.QuestionWarning').show(); 
        } 

        _sumDisplay.val(sum); 

       }); 
      }); 
     } 

     percentage_hardcoded_form('#aspnetForm #questions_page_Page17', designForm_ids_1, "#question_DCWorkSplit", "#DCWorkSplit"); 

以下是我与工作的的jsfiddle: http://jsfiddle.net/q05k48b7/1/

更新

我已经更新了JS提琴见链接下面,仍然无法正常工作。

http://jsfiddle.net/q05k48b7/2/

+0

你'sum'总是复位为0每'onblur'事件。 –

+0

好吧我试着把var的总和放在每个之外,但是它总是增加到总数上,但是当值减少时它不会删除?有任何想法吗? – neoszion

+0

如果我愿意这样做,我将为该组文本框分配一个公共类,并获取每个文本框的值(通过类),然后将它们相加并分配给另一个文本框,每次发生onchange事件时 –

回答

1

如何通过引入一个窗体类型的对象,你们每个人有不同的形式,简化了代码?

var formObj = function($){ 
    var fields = []; 
    var total = 0; 
    var totalField = null; 

    return { 
     setFields: function(fieldIds){ 
      fields = fieldIds; 
     }, 
     setTotalField: function(fieldId){ 
      totalField = fieldId 
     }, 
     setTotal: function(){ 
      var total = 0; 
      $.each(fields, function(idx,item){ 
       var v = $('#'+item).val(); 
       if(!isNaN(v)){ 
        var nV = Number(v); 
        total += nV; 
       } 
      }); 
      $('#'+totalField).val(total); 
     }; 
    }; 
}; 

然后,您可以使用这样的:

var form1 = new formObj($j); 
form1.setFields([ 
    'TurnoverFromOwnDesign', 
    'Feesinrespectofdesignonly', 
    'TurnoverFromSubcontractedWork', 
    'TurnoverFromSupervisedWork', 
    'TurnoverDesignsByClient', 
    'DCAllotherturnover' 
]); 
form1.setTotalField('DCWorkSplit'); 
form1.setTotal(); 

的问题是不是太清楚 - 一个MVCE会有所帮助,但我认为this fiddle表明上面的图案做你想要什么。

注意,小提琴要求输入change处理各formObjsetTotal方法:

$j('#questions_page_Page17 input').change(function(){ 
    form1.setTotal(); 
    form2.setTotal(); 
}); 
+0

这看起来好多了,我会测试什么时候回到我的办公桌,非常感谢你,这让我疯狂。 – neoszion

+0

@neo没问题,希望能解决问题!如果你遇到困难,让我知道。 –

+1

所有的作品很好,我实际上通过在原始函数之外添加一个单独的函数并在每个函数内部调用它来解决我的原始问题。但我已经使用过你的版本,因为它效果更好。再次感谢。 – neoszion