5

現在、すべてのモジュールで同様の機能を持つ小さな Web アプリケーションを構築しています。私の隣にいるすべてのプログラマーがこれらの関数を呼び出すと、これらの関数が機能を実装するために必要だが重要なデータを返すように、小さな汎用関数をコーディングしたいと考えています。この例では、典型的な「真か偽かを選択する」演習に取り組もうとしています。したがって、template.php から次の関数を呼び出します。

function checkAnswers(){
var radiobuttons = document.form1.exer1;
var correctAnswers = answers(); //this is an array of string
var checkedAnswers = checkExerciseRB(radiobuttons, 2, correctAnswers);
    for(i=0; i<checkedAnswers.length; i++){
        alert(checkedAnswers[i]);
    }
}

関数 checkExerciseRB は私の汎用関数で、checkAnswers から呼び出されます。

function checkExerciseRB(rbuttons, opciones, correct){
    var answers = new Array();
    var control = 0;
    for(i=0; i<rbuttons.length; i++){
        var noPick="true";
        for(j=0; j<opciones; j++){
            if(rbuttons[control+j].checked){
                if(rbuttons[control+j].value==correct[i]){
                    answers[i]= 1;
                    noPick="false";
                    break;
                }
                else{
                    answers[i]=2;
                    noPick="false";
                    break;
                }
            }
        }
        if(noPick=="true")
            answers[i]=0;
        control=control+opciones;
    }
    return answers;
}

うまく機能しますが、私のお気に入りのブラウザー (FireFox、Chrome) のエラー ログを見ると、次のように表示されます。

TypeError: rbuttons[control + j] is undefined

この問題に対処する方法の手がかりはありますか?

4

3 に答える 3

7

これはおそらくcontrol + j、配列の長さ以上であることを意味しrbuttonsます。のような配列要素はありませんrbuttons[control + j]

お気に入りのブラウザでJavaScriptデバッガを使用する方法を学ぶ必要があります。デバッガーは素晴らしいです。彼らはあなたがこのコードが行ごとに、あなたが望むように速くまたは遅く実行されるのを見ることができ、そしてcontrolあなたが行くにつれて価値がどのように変化するかを見ることができます。

あなたはそれを見て、「ああ!そのコード行は間違っています!」</ p>

于 2012-07-20T20:01:35.843 に答える
1

時間をループしてrbuttons.lengthいますが、各ループでに2を追加していますcontrol。配列のインデックスを作成するために使用controlして、最後を超えて実行します。

于 2012-07-20T20:02:47.793 に答える
0

control + jで指定されたインデックスが配列に存在しますか?つまり、それが4と評価された場合、配列に少なくとも5つのアイテムがありますか?

また、forループ内でvar i、varjなどを使用する必要があります。それがないと、変数がこのコードが実行されるスコープにリークします(おそらくグローバルスコープであり、それは良くありません):)

于 2012-07-20T20:01:30.047 に答える