我目前正在构建一个在所有模块中具有类似功能的小型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
有关如何处理此问题的任何线索?
答案 0 :(得分:7)
这可能意味着control + j
大于或等于数组rbuttons
的长度。没有rbuttons[control + j]
这样的数组元素。
您应该学习如何在您喜欢的浏览器中使用JavaScript调试器!调试器很棒。它们让您可以按照您想要的速度或速度逐行观看此代码运行,并观察control
的值如何随着您的变化而变化。
你会看到它,你会想到“哦! 那条代码行错了!“
答案 1 :(得分:1)
您正在循环rbuttons.length
次,但在每个循环中,您都会向control
添加2。使用control
索引您的数组,您将跑到最后。
答案 2 :(得分:0)
control + j指定的索引是否存在于数组中?即:如果评估为4,那么阵列中至少有5个项目吗?
此外,您应该在for循环中使用var i,var j等。如果没有它,你的变量就会泄漏到执行此代码的范围内(很可能是全局范围,这并不好):)