2015-06-30 3 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/

Update

Я обновил скрипку JS см ссылка ниже, все еще не работает.

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

+0

Ваш 'sum' всегда сбрасывается в 0 на каждом' onblur' события. –

+0

Хорошо, я попытался поместить сумму var за пределы каждого, но он продолжает прибавлять к сумме, но не удаляет, когда значение уменьшается? Есть идеи? – neoszion

+0

Если я это сделаю, я назначу общий класс этой группе текстовых полей и получаю значения каждого текстового поля (через класс), суммирую их и назначая другому текстовому полю каждый раз, когда происходит событие onchange –

ответ

1

Как насчет упрощения кода путем введения объекта Form типа, для каждого из различных форм у вас есть?

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 демонстрирует выше модель делает то, что вы пытаетесь ,

Обратите внимание, что скрипку вызывает метод setTotal для каждого formObj на входе change обработчика:

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

Это выглядит намного лучше, я буду проверять, когда вернусь к своему столу, огромное спасибо, что это сводило меня с ума. – neoszion

+0

@neo Нет проблем, надеюсь, что это сработает! Дайте мне знать, если вы столкнетесь с трудностями. –

+1

Все отлично работает, я действительно исправил свой оригинальный вопрос, добавив отдельную функцию за пределы исходной функции и назвал ее внутри каждого. Но я использовал вашу версию, поскольку она работает лучше. Еще раз спасибо. – neoszion

Смежные вопросы