Javascript 如何根据复选框计算总价

Javascript 如何根据复选框计算总价,javascript,jquery,Javascript,Jquery,在我们的网站,我有一个购物车表,其中包含所有的项目。每行都有复选框。通过单击复选框,它将确定您要结帐的购物车的总价。起初我不知道我的问题的标题应该是什么,因为我有两个问题 首先,当我单击所有复选框时,全选复选框将被选中,如果我取消选中一个复选框,则全选将被取消选中 第二,正确地根据复选框获取总价格。当我勾选复选框时,我可以得到总价。所有这些加起来,但如果我勾选了全选,同时选中了所有其他复选框,则会增加另一个不正确的总数。请看我上传的演示 我猜这是因为我把计算也放在了“全选”中,但实际上我已经没有

在我们的网站,我有一个购物车表,其中包含所有的项目。每行都有复选框。通过单击复选框,它将确定您要结帐的购物车的总价。起初我不知道我的问题的标题应该是什么,因为我有两个问题

首先,当我单击所有复选框时,全选复选框将被选中,如果我取消选中一个复选框,则全选将被取消选中

第二,正确地根据复选框获取总价格。当我勾选复选框时,我可以得到总价。所有这些加起来,但如果我勾选了全选,同时选中了所有其他复选框,则会增加另一个不正确的总数。请看我上传的演示

我猜这是因为我把计算也放在了“全选”中,但实际上我已经没有办法实现这一点了

这是我的密码

桌子


只要在你的
$('.选择所有“).打开('更改'
),它就会工作。然后删除其他部分

$('.select_all').on('change', function(){
    
    $('.cart_checkbox').not(this).prop('checked', this.checked);
    // reset total value to 0 because in below every product values are being fetched and summed up.
    overall_total = 0;

    if($(this).is(":checked")) {
        $('.total_price').each(function(){
            total_price = $(this).data('total_price');
            overall_total = overall_total + parseFloat(total_price);
        });
    }
    //else{
    //    $('.total_price').each(function(){
    //        total_price = $(this).data('total_price');
    //        overall_total = overall_total - parseFloat(total_price);
    //    });
    //}

    $('.overall_total').text(formatToCurrency(overall_total));
});

对于第一个问题,您可以检查总复选框和选中复选框的长度是否不相等,具体取决于此选中/取消选中“全选”复选框

现在,对于下一个问题,我已经将整个计算部分移动到不同的函数中,所以无论何时需要求和,都可以调用此函数,然后只循环检查trs行并更改合计值

演示代码

$('.select_all')。在('change',function()上{
$('.cart_checkbox')。不是(this.prop('checked',this.checked));
sum();//调用这个
});
$(“.cart\u复选框”).change(函数(){
变量总长度=$(“.cart\u复选框”).length;
var checked_length=$(“.cart_复选框:checked”).length
//检查长度是否小于总长度
如果(检查长度<总长度){
$('.select_all').prop('checked',false);//取消选中。。
}否则{
$('.select_all').prop('checked',true);//检查
}
sum();//调用这个
})
函数和(){
var-total_-total=0;
//仅循环通过已检查的trs。。
$(“.cart\u复选框:选中”).closest(“tr”).find(“.total\u price”).each(函数(){
总价=$(此)。数据(“总价”);
总体价格=总体价格+浮动价格(总价);
})
$('.total_total').text(total_total);//添加格式fn
}

预览
产品
价格
量
全部的
“alt=”“class=“购物车预览”>
A.
₱ 34
-
“class=”购物车预览“>
A2
₱ 34
-
“class=”购物车预览“>
A3
₱ 343
-

哇!非常感谢。起初我有一个想法,计算应该在单独的函数上进行。只是不知道如何应用它。另外,我永远不会想到这一行
$(“.cart\u checkbox:checked”).closest(“tr”).find(“.total\u price”).each(function(){});
我不知道我可以循环检查复选框。再次感谢。
计算应该在单独的函数上。
我把整个部分放在函数中,因为你需要在多个地方使用代码,所以你可以简单地调用函数,而不是多次编写代码。啊,这样我就可以循环或重用代码。是的,重用代码:)这不适用于不减去总价。但是如果选中“全选”,它仍然会将总价添加到“总价”复选框的顶部。但是谢谢,我明白了逻辑。
var overall_total = 0;

$('.select_all').on('change', function(){
    $('.cart_checkbox').not(this).prop('checked', this.checked);

    if($(this).is(":checked")) {
        $('.total_price').each(function(){
            total_price = $(this).data('total_price');
            overall_total = overall_total + parseFloat(total_price);
        });
    }else{
        $('.total_price').each(function(){
            total_price = $(this).data('total_price');
            overall_total = overall_total - parseFloat(total_price);
        });
    }
    $('.overall_total').text(formatToCurrency(overall_total));
});

$(".cart_checkbox").change(function(){
    var total_price = $(this).closest('tr').find('.total_price').data('total_price');

    if($(this).is(":checked")) {
        overall_total = overall_total + parseFloat(total_price);
    }else{
        overall_total = overall_total - parseFloat(total_price);
    }
    $('.overall_total').text(formatToCurrency(overall_total));
})
$('.select_all').on('change', function(){
    
    $('.cart_checkbox').not(this).prop('checked', this.checked);
    // reset total value to 0 because in below every product values are being fetched and summed up.
    overall_total = 0;

    if($(this).is(":checked")) {
        $('.total_price').each(function(){
            total_price = $(this).data('total_price');
            overall_total = overall_total + parseFloat(total_price);
        });
    }
    //else{
    //    $('.total_price').each(function(){
    //        total_price = $(this).data('total_price');
    //        overall_total = overall_total - parseFloat(total_price);
    //    });
    //}

    $('.overall_total').text(formatToCurrency(overall_total));
});