1

いくつかの個々の成績を指定して最終成績を計算し、その結果を html ページに出力する JS コードを書いていますが、イベントと関数をトリガーすると、残りのコードに到達することなく for ループで 1 回だけループします (チェックしたprint ステートメントを使用しています) が、コードの残りの部分に到達できないループの何が問題なのかわかりません。

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

配列の値は 0 から始まります。i=0 および i<=list.length-1 を試してください。最初のリスト要素をカウントしていません。

list[0].type ではなく list[1].type から開始しています。

于 2013-03-30T14:58:07.017 に答える
0

コードには 2 つの問題があります。

初め:

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

次のようにする必要があります。

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

配列は0から始まるからです。

しかし、次のように 1 ではなく 0 から開始する必要があると思います。

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

2番:

display.append(out);

次のようにする必要があります。

display.appendChild(out);

appendメソッドはありません。代わりにappendChildを使用してください。

于 2013-03-30T14:58:54.427 に答える
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);
...

値をintに解析していませんでした。つまり、値が追加されるのではなく連結されていました....次に、0-1になるはずの整数除算を行っていたので(丸め後は常に0または1になります)、乗算しました最初に 100 で...また、あなたの i%2 != 0 が間違った変数に割り当てられていたので、変更しました..これは、それが機能することを示すjsfiddleです.. http://jsfiddle.net/6Y8xY/1/

于 2013-03-30T15:17:45.313 に答える
0

NodeLists (および JavaScript の配列) はゼロ インデックスであり、最後の要素はlength-1です。したがって、ループは

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

存在するリスト内のアイテムのみにアクセスします。そうしないと、結果がundefinedになり、そのプロパティにアクセスするとvalue例外がスローされ、関数全体が停止するため、何も出力されません。[error] consoleで例外を確認できるはずです。

于 2013-03-30T15:09:20.410 に答える