1

我正在编写一个 JS 代码来计算给定一些个人成绩的最终成绩并在 html 页面中输出结果,但是当我触发事件和函数时,它仅在我的 for 循环中循环一次,而不会到达代码的其余部分(我检查了使用打印语句),但我不明白导致无法访问其余代码的循环有什么问题。

HTML:

<!DOCTYPE html>
<html>
    <head>
        <title>Problem 2</title>
        <script src="grades.js" type="text/javascript"></script>
    </head>

    <body>
        <h1>Grade Calculator</h1>
        <form id ="myForm">
            <div id="assignments">
            HW <input type="text" size="1"/> / <input type="text" size="1"/><br/>
            HW <input type="text" size="1"/> / <input type="text" size="1"/><br/>
            HW <input type="text" size="1"/> / <input type="text" size="1"/>
            </div>

            <div>
                <input type="checkbox" id="curve"/> Curve +5?
            </div>

            <div id="resultsarea">
                <p>
                    <!--add buttons here -->
                    <button type="button" id="comp">Compute</button>
                    <button type="button" id="clr">Clear</button>
                </p>

                <!-- add results here -->
            </div>
        </form>
    </body>
</html>

JS:

window.onload = pageLoad;

function pageLoad()
{
    var cbutton = document.getElementById("comp");
    cbutton.onclick = compute;
}

function compute()
{
    var list = document.getElementsByTagName("input");
    var marks = 0;
    var total = 0;
    for (var i=1; i <= list.length; i++)
    {
        if(list[i].type == "text")
        {
            if (i%2 != 0)
            marks += list[i].value;
            else
            total += list[i].value;
        }
    }
    var result = Math.round(marks/total);
    if (document.getElementById("curve").checked)
    result += 5;
    var out = document.createElement("div");
    var t = document.createTextNode(result);
    out.appendChild(t);
    var display = document.getElementById("resultsarea");
    display.append(out);
}
4

4 回答 4

0

我查看了答案,似乎没有人对此有主要问题......所以:

...
for (var i=0; i <= list.length-1; i++)
{
    if(list[i].type == "text")
    {
        if (i%2 == 0)
        marks += parseInt(list[i].value);
        else
        total += parseInt(list[i].value);
    }
}
var result = Math.round(parseFloat(marks / total)*100);
...

你没有将值解析为整数,这意味着它们被连接而不是相加......然后你对本来应该是 0-1 的东西进行整数除法(四舍五入后总是 0 或 1),所以我乘以首先是 100 ...您的 i%2 != 0 也分配给了错误的 var,所以我更改了它.. 这是一个 jsfiddle 演示它的工作原理.. http://jsfiddle.net/6Y8xY/1/

于 2013-03-30T15:17:45.313 回答
0

NodeLists(以及 JavaScript 中的数组)是零索引的,它们的最后一个元素是 at length-1。因此,循环需要

for (var i=0; i<list.length; i++)
// or
for (var i=0; i<=list.length-1; i++) // uncommon

仅访问列表中存在的项目。否则,它们会导致undefined, 并且访问它的value属性会引发一个异常,从而停止你的整个函数 - 所以没有任何输出。您应该能够在[error] 控制台中看到异常。

于 2013-03-30T15:09:20.410 回答
0

数组值从 0 开始。尝试 i=0 和 i<=list.length-1。您不计算第一个列表元素。

您是从 list[1].type 而不是 list[0].type 开始的。

于 2013-03-30T14:58:07.017 回答
0

您的代码中有两个问题。

第一的:

for (var i=1; i <= list.length; i++)

应该:

for (var i=1; i <= list.length - 1; i++)

因为数组是从 0 开始的。

但是,我认为它应该从 0 而不是 1 开始,如下所示:

for (var i=0; i < list.length; i++)

第二:

display.append(out);

应该:

display.appendChild(out);

没有append方法,使用appendChild代替。

于 2013-03-30T14:58:54.427 回答