Как рассчитать сумму нескольких динамических полей ввода в Javascript? - PullRequest
1 голос
/ 28 июня 2019

Я пытаюсь вычислить сумму нескольких динамических полей ввода с помощью JavaScript.

Это мой основной ввод:

<input type="text" name="price[]" id="price" value="" class="form-control" />

Вот как я добавляю входы:

$('.btn-add-srvice').on('click', function(e){

e.preventDefault();

var template = '<input type="text" name="price[]" id="price" class="form-control" />';

$(this).before(template);
});

После этого у меня есть пользовательская функция, которая вычисляет данные из входных данных:

function sum() {
    var price = document.getElementById('price').value;    
    var subtotal;    
}

Она рассчитывает только один вход (не добавленные входы).Теперь я хочу вычислить сумму цены каждого входного значения, которое отображается после создания с помощью функции выше.

Ожидаемый результат:

input1 = 30
input2 = 30
...... = ...
subtotal = ...

Таким образом, переменная промежуточного итога должна заполняться суммой для каждого входа.Спасибо.

Обновлено

Теперь, как я могу вычислить сумму каждой строки, а также промежуточный итог.Ниже функций вы можете найти ссылку на ожидаемый результат.

Моя полная функция JavaScript:

$(document).on('keyup keydown change', ".price, .months, #mwst, #rabatt",function () {
            var months = document.getElementById('months').value;
            var mwst = document.getElementById('mwst').value;
            var rabatt = document.getElementById('rabatt').value;

             var priceSum = 0;
             var monthsSum = 0;
                $('.price').each(function(){
                    priceSum += parseFloat(this.value);
                });
                $('.months').each(function(){
                    monthsSum += parseFloat(this.value);
                });
                var subtotal = priceSum * monthsSum;
                var sum = priceSum * months;
                var mwstValue = subtotal + 7.7 / 100 * subtotal - subtotal;
                document.getElementById('subtotal').value = subtotal.toFixed(2);
                document.getElementById('sum').value = subtotal.toFixed(2);
                document.getElementById('mwst').value = mwstValue.toFixed(2);
                var percentage = (mwst / 100) * subtotal;
                var result = subtotal + mwstValue - parseFloat(rabatt);
                document.getElementById('total').value = result;
        });

Мои полные динамические вставленные входы:

$('.btn-add-srvice').on('click', function(e){

            e.preventDefault();

            var template = 
            '<div class="col-md-12" style="padding:0">'+
                '<div class="col-md-6" style="padding-left:0px">'+
                    '<div class="form-group">'+
                         '<select style="width: 100%" id="service_id" name="service_id[]" class="service_id ">'+
                         '@foreach($servicesList as $sli)'+                                 
                         '<option value="{{$sli->id}}">{{$sli->name}}</option>'+
                          '@endforeach'+
                          '</select>'+
                    '</div>'+
                '</div>'+
                '<div class="col-md-3" style="padding-right:0px">'+
                    '<div class="form-group">'+
                        '<input type="text" name="price[]" id="price" value="" class="form-control price" />'+                      
                    '</div>'+
                '</div>'+
                '<div class="col-md-1" style="padding-right:0px">'+
                    '<div class="form-group">'+
                        '<input type="text" name="months[]" id="months" value="" class="form-control months" />'+                       
                    '</div>'+
                '</div>'+
                '<div class="col-md-2" style="padding-right:0px">'+
                    '<div class="form-group">'+
                        '<input type="text" name="sum[]" id="sum" value="" class="form-control sum" />'+                        
                    '</div>'+
                '</div>'+
                '<div>'+
                /*'<button type="button" class="btn btn-default btn-xs remove">Remove</button>'+*/
                '</div>'+
            '</div>';
    enter code here
            $(this).before(template);

        });

Вотссылка как выглядит сейчас и ожидаемый результат: https://ibb.co/sVv3qGF

Ответы [ 6 ]

2 голосов
/ 28 июня 2019

Вы даете один и тот же идентификатор нескольким элементам. Вместо этого дайте урок. Тогда получите их сумму.

var sum = 0;
$('.price').each(function(){
    sum += parseFloat(this.value);
});
1 голос
/ 28 июня 2019

Попробуй вот так. использовать class в HTML элементах и ​​в jquery попытаться зациклить и получить значение и суммировать его.

$('.btn-add-srvice').on('click', function(e){

  e.preventDefault();

  var template = '<input type="text" name="price[]" id="price" class="form-control price" />';

  $(this).before(template);
});
$(document).on('keyup', ".price",function () {
  var total = 0;
  
  $('.price').each(function(){
    total += parseFloat($(this).val());
  })  

  console.log(total)
})
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

<input type="text" name="price[]" id="price" value="" class="form-control price" />

<input type ="button" value="add" class="btn-add-srvice"/>
1 голос
/ 28 июня 2019

Во-первых, ваша строка шаблона для добавления входных данных неверна, идентификатор, как следует из названия, является уникальным идентификатором и может использоваться только один раз на странице. Вам не нужен идентификатор, поэтому удалите его из шаблона

var template = '<input type="text" name="price[]" class="form-control" />':

Теперь просто обновите функцию ввода суммы:

function sum() {
    var priceElements = document.querySelectorAll('[name^=price]');
    var sum = 0;
    priceElements.forEach(function(element) {
       sum = sum + element.value;
    });
    console.log(sum);   
}
0 голосов
/ 28 июня 2019

Дайте каждому входу общий класс. Дайте, приведенный ниже пример кода.

function doSum() {
  var x_names = document.getElementsByClassName("x_name")

  for(var i = 0; i < x_names.length; i++) {
    alert(x_names[i].value)
    // You can do sum of values here
  }
}
<input type="text" class="some_name" name="price[]" id="price" value="">
<input type="text" class="some_name" name="somethingElse" id="somethingElse" value="">
0 голосов
/ 28 июня 2019
let subtotal;

const summOfValues = (summ, element) => summ + Number(element.value);

$('.btn-add-srvice').on('input', function(){
   subtotal = $('[name="price[]"]',this).toArray().reduce(summOfValues);
   $('other').val(subtotal);
})
0 голосов
/ 28 июня 2019
  • Во время добавления динамического поля ввода вы должны задать уникальный идентификатор для каждого поля.
  • Затем сохранить список уникальных идентификаторов.
  • Выполнить итерацию в этом списке и рассчитатьсумма.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...