如何在javascript中求和输入数字和数据库值

时间:2019-02-12 07:23:12

标签: javascript html

我已附加数据,并在隐藏的输入中打印每个数据价格。现在,我想用输入数字作为数量对这些价格求和,以便获得总金额,但什么都没打印。

代码

javascript

success:function(data) {
        //append data to my view
        data.forEach(function(row) {
            var $meto = '';
            $meto += '<div class="col-md-3 mt-2">'+
                '<div class="card">'+
                    '<div class="card-body">'+
                        '<img src="{{url("images")}}/'+row['photo']+'" class="menuimg img-fluid" alt="image">'+
                        '<p>'+row['name']+'</p>'+
                        '<input type="number" name="qty[]" class="qty form-control">'+
                        '<input type="hidden" class="price" value="'+row['price']+'" />'+
                    '</div>'+
                '</div>'+
            '</div>';
            $('.here').append($meto);

            //sum prices
            $('.qty').on('keyup',function(){
                var qty = $('.qty').val();
                var price = $('.price').val();
                $("#total").html(qty*price);
            });
        });
}

html

<div class="col-md-10">
  <div class="row here"></div>
</div>
<p>Total: <span id="total"></span></p>

说明

我已经用数量1 & 3填充了我的2个商品,每个商品下面都有隐藏的输入信息,这些商品保持着价格(本示例中的商品是5000 & 16000

基本上,我应该在总div中添加以下内容:

1*5000 = 5000
3*16000 = 48000
Total = 53000

但是,它只会得到我的第一个输入,而忽略其余的输入。有什么想法吗?

4 个答案:

答案 0 :(得分:1)

您未添加所有商品的价格。您需要遍历所有项目并计算总计。

注意:在您的forEach语句之后保留此内容。 试试这个:

$('.qty').on('keyup',function() {
    var quantities = $('.qty');
    var prices = $('.price');
    var total = 0;
   $.each(quantities, (index, qty) => {
        total += parseInt($(qty).val() || 0) * parseFloat($(prices[index]).val() || 0) 
    });
    $("#total").html(total);
});

答案 1 :(得分:0)

我认为问题是,您无法使用“ .val()”函数从多个元素中获取值。您只能从一个元素中获取多个值。

您需要另一个函数来实现您想要的目标。

您应该在这里看看:Stackoverflow Question

在旅途中-您不应该将价格保存到生产环境中的隐藏html元素中。

答案 2 :(得分:0)

遍历父元素以找到每个元素的确切价格和数量。

$('.qty').on('keyup',function(){
    var total = 0;
    $('.card-body').each(function(){
        var qty = parseFloat($(this).find('.qty').val());
        if (!qty) return;
        var price = parseFloat($(this).find('.price').val());
        total += (qty * price);
    });
    $("#total").html(total);
});

附加Fiddle

答案 3 :(得分:0)

我不了解jQuery,尽管我可以帮助您使用Vanilla JS。

这里的问题是:

$('.qty').on('keyup',function(){
            var qty = $('.qty').val();
            var price = $('.price').val();

            $("#total").html(qty*price);
         });

这仅为第一个.qty设置了事件侦听器,即使其中有很多。因此,您应该选择并遍历它们,就像处理数据一样:

let qtyNodes = document.querySelectorAll('.qty');
let priceNodes = document.querySelectorAll('.price');

let outputNode = document.querySelector('#total');
let sum = 0;

qtyNodes.forEach(function(qtyNode) { // Set event listener to every single qty node 

    qtyNode.addEventListener('keyup', function() {

        qtyNodes.forEach((qtyNode, index) => { // Calculate final price, using each meal price per quantity value.
            sum = qtyNode.value * priceNodes[index].value;
        })

    });

})

outputNode.innerHTML = `${sum}`;

重要的是,将类似数组的数组(qtyNodespriceNodes保留在给定的循环之外,因为它将在每次迭代时访问DOM,并且会要求过多的性能。将其放置在外部,您将只能访问DOM。

另外,请注意:您应该使用“ input”事件,而不是“ keyup”事件。用户插入任何数据后,输入事件就会立即触发,就像“ keyup”和“ keydown”的组合一样。