Я хочу найти общую сумму передачи значений поля в массиве. Если поле предназначено для скидки, выполните минус еще плюс. По какой-то причине я получаю Нэн.

Вот мой код скрипта

<script>

    var partial_cost = $('#bill_amount:disabled').val();
    var fine = +$('#fine').val();
    var discount = +$('#discount').val();
    var other_cost = +$('#other_cost').val();
    var total_cost = +$('#total').val();

    var chargeAble = [
    partial_cost,
    fine,
    discount,
    other_cost
    ];

    $.each(chargeAble, function (chargeIndex, charge) {
        charge.blur(function () {
            var amount = 0;
            for(charge in chargeAble)
                if(chargeAble[charge].attr('id') == 'discount')
                    amount -= (chargeAble[charge].val());
                else
                    amount += (chargeAble[charge].val());

                total_cost.val(amount);
            });
    });

</script>
0
Saurav 7 Янв 2017 в 16:54

4 ответа

Лучший ответ

Код использует комбинацию .each() И цикла for-in ... и странным образом обратный вызов из функции blur()? Это можно упростить так:

var amount = 0;
$('#bill_amount:disabled, #fine, #discount, #other_cost')
  .blur()
  .each(function() {
    var sign = this.id === 'discount' ? -1 : 1;
    amount += parseFloat($(this).val()) * sign;
  });
$('#total').val(amount);

Обновление:

О, вы хотите, чтобы общее количество обновлялось при размытии ... попробуйте этот код:

var $values = $('#bill_amount:disabled, #fine, #discount, #other_cost');
$values.on('blur', function() {
  var amount = 0;
  $values.each(function(){
    var sign = this.id === 'discount' ? -1 : 1;
    amount += parseFloat($(this).val()) * sign;
  });
  $('#total').val(amount);
});
0
Mottie 7 Янв 2017 в 14:27

Убедитесь, что все значения интерпретируются как числа в JavaScript. В противном случае он будет пытаться вычислить какой-то нечетный результат из строки, которая может быть интерпретирована как нечто иное, чем десятичное число (hex, octa, ...).

0
Felix 7 Янв 2017 в 14:13

Я могу видеть такие вещи вокруг:

var fine = +$('#fine');

Метод jQuery() возвращает объекты jQuery, а не числа или даже строки. Таким образом, принудительное приведение числа вернет NaN.

Вы должны сначала взять текст внутри, а затем разобрать номера из него. Как это сделать, зависит от того, как ваш HTML структурирован, но в целом:

  • В полях формы вы обычно можете использовать .val()
  • В большинстве других тегов вы можете использовать .text()
0
Álvaro González 7 Янв 2017 в 14:08

Ваш массив содержит числа, и вы действуете как строки

var chargeAble = [  //this holds values
    partial_cost,
    fine,
    discount,
    other_cost
];

И в цикле вы используете его для идентификатора ???

chargeAble[charge].attr('id') 
0
epascarello 7 Янв 2017 в 14:34