2010-05-27 65 views
0

我有一个问题,试图为我的计算获得准确的运行总数。当您在输入字段中输入数字时,我会得到该订单项的准确总数,但总计数量会更高。请注意,这是一个动态表单,并且该ID将根据我添加到表单中的表单字段的数量而改变。另外,我已经设置为每个输入字段计算onKeyUp而不是计算按钮。在jquery中运行总计的问题

计算单个项目的代码是这样的:

function calcLineItem(id) { 
    var id = $(id).attr("id"); 
    var Item1 = $("#Item1" + id).val(); 
    var Item2 = $("#Item2" + id).val(); 
    var Item3 = $("#Item3" + id).val(); 

    function calcTotal(Item1, Item2, Item3){ 
     var total; 
     total = Math.round((Item1 * Item2) * Item3); 
     return total; 
    } 

    $("#total" + id).text(calcTotal(Item1, Item2, Item3)); 

    calcAllFields(); 
} 

这会给我总该特定输入字段。在年底,calcAllFields()功能,是应该做的所有项目计算在我的形式给我总计所有输入的字段:

function calcAllFields(id) { 
    var id = $(id).attr("id"); 
    $('#target1').text($("#total" + id).map(function() { 
     var currentValue = parseFloat(document.getElementById("currentTotal").value); 
     var newValue = parseFloat($("#total" + id).text()); 
     var newTotal = currentValue + newValue; 
     document.getElementById("currentTotal").value = newTotal; 
     return newTotal; 
     }).get().join()); 
} 

变量currentTotal从隐藏字段上获取其值我的表格:

<input type="hidden" id="currentTotal" value="0"> 

当我进入数字字段该行的计算将是准确的,但总计将是不准确的,因为currentTotal值将继续与每次击键我做输入递增领域。任何想法如何避免这种情况发生?

UPDATE:

<tr id="row1"> 
    <td><input type="text" id="field_1 onKeyUp="calcLineItem("#row1")></td> 
    <td><input type="text" id="field_2 onKeyUp="calcLineItem("#row1")></td> 
</tr> 

我希望这有助于:形式输入字段会是什么样的一个例子。

+1

我认为你可能错误地处理了这个问题,你可以在你的问题中增加一些标记吗?项目组的几次迭代会很有帮助。 – Joel 2010-05-27 15:34:47

+0

我很确定这不是在jQuery中使用'.map()'的正确方法 - http://api.jquery.com/jQuery.map/ 尽管我自己从来没有使用它,但我不能某些。 – Sam 2010-05-27 15:36:41

回答

2

看来,当你计算总计时,你永远不会删除前面的总数。例如,

我从总共0开始。我改变了ID1并得到700。现在我的总计是700.但是,如果我再次更改ID1并设置为680,我的总计将是1380(700 + 680)。

您应该从0开始,然后在calcGrandTotal()上再次循环所有总计,以便在计算新的订单项总数之前获取所有客户端更改或跟踪上一个总计,以便您可以正确地从中扣除它总计。另外,如果你有很多的行项目添加到您的总计,您可以只考虑调用calcGrandTotal()当你的文本框失去焦点的,否则你可能有很多JS计算的背景,就会响个不停干扰您的网站的动画和整体响应。

1

这是怎么回事?

function calcAllFields(id) { 
    var id = $(id).attr("id"); 
    document.getElementById("currentTotal").value = 0; //reset the total as it will be caluclated next 
    $('#target1').text($("#total" + id).map(function() { 
     var currentValue = parseFloat(document.getElementById("currentTotal").value); 
     var newValue = parseFloat($("#total" + id).text()); 
     var newTotal = currentValue + newValue; 
     document.getElementById("currentTotal").value = newTotal; 
     return newTotal; 
     }).get().join()); 
} 
+0

这只会在他的列表中找出一个更改的项目来计算总计并给出0 + changedItemTotal = changedItemTotal的结果。他需要一个for(i = 0; i Tommy 2010-05-27 15:39:31

+0

这可能是正确的,我只是懒惰:) – 2010-05-27 15:44:38

+0

我最初厌倦这一点,虽然它似乎工作起初,我意识到,因为我会增加更多的领域,我的形式它会重置我的总额,每次给我总数该特定的订单项。 – rshivers 2010-05-27 15:45:02

1

我会稍微改变一下。你需要一个函数返回一行的总数(看起来像是calcLineItem),只需要移除calcAlffields的调用就可以了,像calcrow一样添加一个类到需要进行累计的每一行中,而不仅仅是这样做:

function updateTotal() { 
    total = 0; 
    $.each($(".calcrow"), function(index, value) { 
     total += calcRow($(value).attr("id")); 
     }); 
    $("#currentTotal").value(total); 
} 

另外,如果你不想再calc下每一行(它看起来像你在什么地方存储行总计)有行更新功能更新该行总比称这个updateTotal。

function updateTotal() { 
    total = 0; 
    $.each($(".rowtotal"), function(index, value) { 
     total += $(value).attr("id"); 
     }); 
    $("#currentTotal").value(total); 
}