Pergunta

Esta é uma pergunta relacionada a uma Eu postei anteriormente ... Eu estou tentando somar todos os elementos de entrada que começam com 'pull' e lugar que total no campo de entrada 'totalpull'. Eu tenho que trabalhar parte. Agora, eu estou tentando calcular a média, se um usuário digita algo manualmente no campo de entrada 'totalpull' e definir cada entrada de 'puxar' a esse valor. Tentando abaixo, mas ele não funciona ...

//This is the sum formula, which works
        $('input[name^=pull]').bind('keyup', function() {
                $('#totalpull').val( $('input[name^=pull]').sumValues() );
        });

        $.fn.sumValues = function() {
                var sum = 0; 
                $("input[name^='pull']").each(function() {
                        if ( $(this).is(':input') ) {
                                var val = $(this).val();
                        } else {
                                var val = $(this).text();
                        }
                        sum += parseFloat( ('0' + val).replace(/[^0-9-\.]/g, ''), 10 );
                });
                return sum;
        };


//This is the avg formula, which does not work
//Keep getting v / rowCount.replace is not a function
        $('input[name=totalpull]').bind('keyup', function() {
                $('input[name^=pull]').each(function() {
                        $(this).val( $('input[name=totalpull').avgValues() );
                });
        });
        $.fn.avgValues = function() {
                var avg = 0;
                var v = $("input[name=totalpull").val();
                var rowCount = $("#convertRow tr").length; 
                avg += parseFloat( (v / rowCount).replace(/[^0-9-\.]/g, ''), 10);
                return avg;
        }

<table id="convert">
<tbody>
<tr><td><input type="text" value="" name="pull0" /></td></tr>
<tr><td><input type="text" value="" name="pull1" /></td></tr>
<tr><td><input type="text" value="" name="pull2" /></td></tr>
<tr><td><input type="text" value="" name="pull3" /></td></tr>
</tbody>

<tfoot>
<input type="text" id="totalpull" name="totalpull" value="" />
</tfoot>
</table>
Foi útil?

Solução

Seu problema imediato é apenas um erro de sintaxe:

 avg += parseFloat( (v / rowCount).replace(/[^0-9-\.]/g, ''), 10);

Não há replace em um número. Você precisa de um toString jogado em:

 avg += parseFloat( (v / rowCount).toString().replace(/[^0-9-\.]/g, ''), 10 );

BTW, também não há / para uma string (como v é), mas JavaScript vai tentar convertê-lo para você e dar-lhe NaN se não puder.

Outras dicas

Em sua função SumValues, você está repetindo o 'input [nome ^ = puxar]' selector. Você deve quer passar o selector em sua função, ou agir sobre os valores que você já tem.

Em SumValues, 'isto' deve ser uma coleção de entradas. Portanto, você deve ser capaz de fazer algo como:

$.fn.sumValues = function() {
  var sum = 0;
  this.each(function() {
    sum += $(this).val();
  });
  return sum;
}

Você também tem 'input' e ': input' confuso. 'Entrada' é uma marca de entrada. :. De entrada é qualquer entrada ou selecione tag

Quando soma total é alterado manualmente, o valor é distribuído para "puxar *" campo:

$('input[name=totalpull]').bind('keyup', function() {
    var inp = $('input[name^=pull]');
    inp.val(parseFloat($(this).val()) / inp.length);
});​
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top