我尝试设置一个有几个问题的测验。每个问题都将使用相同的输入字段:
1984年谁是总统?
1 - 卡特
2 - 克林顿
3 - 里根
4 - 给朋友打电话!
一定是我不明白的东西。以下是发生的事情:
我声明了一个数组和一个变量:
// Questions Data Structure
var qData = {};
var questionList = new Array();
var curQuestion = parseInt(0);
在给定的表单中,用户可以在各种输入字段和textareas中输入值。
然后,用户可以在转到同一网页中的下一个问题之前单击“保存答案”按钮,而不进行回发。
保存按钮执行此操作(gel()
是document.getElementById
的缩写):
curQuestion++;
qData.qQuestionText = gel("questionText").value;
qData.qAnswer1 = gel("Answer1").value;
qData.qAnswer2 = gel("Answer2").value;
qData.qAnswer3 = gel("Answer3").value;
qData.qAnswer4 = gel("Answer4").value;
qData.qAnswerText = gel("AnswerText").value;
questionList[curQuestion] = qData;
第一个问题保存好了。
现在,不管你信不信,当qData
结构在问题2(或3 ......)发生变化时,questionList
数组中所有元素的值都会发生变化,并且它们将获得相同的值!
好像所有questionList
项永久链接到qData
数组!
有什么问题?
答案 0 :(得分:2)
您的数组包含对象的引用,这就是为什么数组中的所有内容在每个问题后都会发生变化的原因。您似乎期望在将对象推送到阵列时克隆该对象,但事实并非如此。
为每个问题创建一个新对象,如下所示:
curQuestion++;
qData = {}; // <-------------- create a new object
qData.qQuestionText = gel("questionText").value;
qData.qAnswer1 = gel("Answer1").value;
qData.qAnswer2 = gel("Answer2").value;
qData.qAnswer3 = gel("Answer3").value;
qData.qAnswer4 = gel("Answer4").value;
qData.qAnswerText = gel("AnswerText").value;
questionList[curQuestion] = qData;