我的js功能没有完美添加

时间:2014-01-28 14:55:39

标签: javascript php html

正如你所看到的那样,我在一个表上过滤的(总)文本框中已有一个值...如果我在(得分)文本框上键入一个数字,它将自动添加总数的当前值(文本框)。

我的问题是它没有完美添加。任何人都可以帮助我。

示例:

enter image description here

html代码:

<form id="frm" name="frm" />
<table>
<tr>
<td>
Name: <br />
<input type="text" name="name" value="<?php if(empty($name[0])){$name[0] = array(NULL);}else{echo $name[0];} ?>" readonly /> <br />
</td>
<td>
Score 1: <br />
<input type="text" name="optA" value="" onchange="optTotal()" /> <br />
</td>
<td>
Score 2: <br />
<input type="text" name="optB" value="" onchange="optTotal()" /> <br />
</td>
<td>
Score 3: <br />
<input type="text" name="optC" value="" onchange="optTotal()" /> <br />
</td>
<td>
Score 4: <br />
<input type="text" name="optD" value="" onchange="optTotal()" /> <br />
</td>
<td>
Total: <br />
<input type="text" name="totals" value="<?php if(empty($total[0])){$total[0] = array(NULL);}else{echo $total[0];} ?>" readonly onKeyUp="optTotal()" /> <br />
</td>
</form>

总计算脚本:

<script>
function optTotal() {
        var a1 = document.forms[0].optA;
        var b1 = document.forms[0].optB;
        var c1 = document.forms[0].optC;
        var d1 = document.forms[0].optD;
        var xtotal = document.forms[0].totals;
        if (a1.value && a1.value != "")
            a1 = parseFloat(a1.value);
        else
            a1 = 0;

        if (b1.value && b1.value != "")
            b1 = parseFloat(b1.value);
        else
            b1 = 0;

        if (c1.value && c1.value != "")
            c1 = parseFloat(c1.value);
        else
            c1 = 0;

        if (d1.value && d1.value != "")
            d1 = parseFloat(d1.value);
        else
            d1 = 0;
        if (xtotal.value && xtotal.value != "")
            xtotal = parseFloat(xtotal.value);
        else
            xtotal = 0;

        var total = a1 + b1 + c1 + d1 + xtotal;
        document.forms[0].totals.value = total;

      }
</script>

1 个答案:

答案 0 :(得分:3)

您的问题是您没有将原始值存储在任何地方。

当你再次运行你的代码时,你从总数中获取当前值(你已经添加了2),然后再次添加5,所以当然值现在是15(10 + 5)。

您需要在加载时获取原始值并将其存储,以便始终添加到原始总计,或者,获取文本框已更改的旧值并减去它是在你添加新值之前的总数。

就个人而言,我认为第一种方法可能更容易。

在加载时就是这样:

 var xtotal = 0;    // define this somewhere so you can access it later in a closure or a global

 var xtotalElement = document.forms[0].totals;
 if (xtotalElement.value && xtotalElement.value != "")
     xtotal = parseFloat(xtotalElement.value);

现在在optTotal

function optTotal() {
    // get all the text boxes *except* the total as before
    // ...

    var total = a1 + b1 + c1 + d1 + xtotal;     // this should be the original xtotal set on load
    document.forms[0].totals.value = total;
}

这是一个有效的fiddle