0

昨天我在解决 $NaN 问题时得到了很大的帮助,所以希望我能从昨天的代码中得到另一个答案,小计现在在每行的末尾添加总计并显示一个值,这样很好,但是无论何时我输入一个金额已售出,然后去更改它再次添加的值,因此如果我将数量设置为 2 并且每个 50 美元,则订单项的总额为 100 美元,小计反映,但如果我将数量更改为 1,则订单项变为 50 美元正确,但小计重新添加并变为 150 美元,我对 JS 的了解不够,看不出我做错了什么......

$(document).ready(function() {
var subtotal = 0;
var stantot = 0;
var showtot = 0;
$("input").keyup(function() {
    for (var i = 0; i <= 30; i++) {
        var unitp = parseFloat($("#unitp" + i).val()) || 0;
        var casep = parseFloat($("#casep" + i).val()) || 0;
        var units = parseFloat($("#units" + i).val()) || 0;
        var cases = parseFloat($("#cases" + i).val()) || 0;
        var st_disc = parseFloat($("#st_disc").val()) || 0;
        var sh_disc = parseFloat($("#sh_disc").val()) || 0;

        var unitr = (unitp * units);
        var caser = (casep * cases);
        var result = (unitr + caser);
        var st_disc_fix = (st_disc / 100);
        var sh_disc_fix = (sh_disc / 100);
        var st_disc_solo = (st_disc_fix * result);
        var sh_disc_solo = (sh_disc_fix * result);
        var disc_total = (st_disc_fix + sh_disc_fix);
        var disc_whole = (disc_total * result);

        var disc = (result - disc_whole);
        var st_disc_tot = (result - disc_whole);
        var sh_disc_tot = (result - disc_whole);

        $("#line" + i).val(result.toFixed(2));
        $("#disc" + i).val(disc.toFixed(2));
        subtotal += parseFloat((unitp * units) + (casep * cases));
        stantot += parseFloat(st_disc_tot);
        showtot += parseFloat(sh_disc_tot);
    }
    $("#totretail").val(subtotal.toFixed(2));
    $("#standiscount").val(stantot.toFixed(2));
    $("#showdiscount").val(showtot.toFixed(2));

    var totship = ($("#totship").val() * 1);
    var tottax = ($("#tottax").val() * 1);

    var finaltotal = (subtotal + stantot + showtot + totship + tottax);
    $("#total").val(finaltotal.toFixed(2));

    });
});
4

3 回答 3

2

var subtotal = 0;在侦听器内部移动input,因此每次都会重新计算小计:

$(document).ready(function() {
  $("input").keyup(function() {
    var subtotal = 0;
    var stantot = 0;
    var showtot = 0;
    for (var i = 0; i <= 30; i++) {

..

否则 total 将继续增长,原因stantotshowtot正在工作是因为它们是从带有=not的 var 设置的+=

我也将其他变量移到了那里,只是因为它更好。

于 2012-09-06T14:47:06.013 回答
1

您的问题是,您从不重置小计。每次它都会继续添加到以前的小计中。您需要做的是在重新计算之前将其重置为零

于 2012-09-06T14:49:03.130 回答
0

我认为您的问题在于以下几行:

var totship = ($("#totship").val() * 1);
var tottax = ($("#tottax").val() * 1);

jQuery 中的.val()方法倾向于返回字符串。但是如果你将一个字符串乘以一个数字,你会得到NaN. 您应该强制这些值是数字。这似乎是你想要做的* 1,但那是行不通的。试试这个:

var totship = +$("#totship").val();
var tottax = +$("#tottax").val();

或者,如果清晰是你的事,你可以这样做:

var totship = Number($("#totship").val());
var tottax = Number($("#tottax").val());

或者

var totship = parseInt($("#totship").val(), 10);
var tottax = parseInt($("#tottax").val(), 10);

任你选。

于 2012-09-06T14:43:21.650 回答