如何检查我的单选按钮是否被选中以及循环是否正常工作?
How do I check if my radio button is selected and the loop is working?
所以我正在尝试制作一个 quiz.html 文件,它会提示用户输入编号。他们想回答的问题。根据他们的输入,将生成随机问题。所以我知道它必须是一个循环,一直循环到 no。输入到警告框。
所以我的 scoreMe() 函数显然没有给出任何答案。我正在尝试检查某个特定问题的选中单选按钮是否等于正确答案,但我的分数仅为 0%。那么谁能告诉我我的代码有什么问题吗?
<div id="quesRes"></div>
<script>
var quizObj = [
{
"question": "What is the capital of Bangladesh?",
"choice": ["Dhaka", "Chittagong", "Sylhet"],
"correct": ["Dhaka"]
},
{
"question": "What does 2+2 equal to?",
"choice": ["3", "2", "4"], //quizObj[2].choice[0],quizObj[2].choice[1]
"correct": ["4"]
},
{
"question": "What is the real name of Damon Salvatore?",
"choice": ["Paul Wesley", "Steven McQueen", "Ian Somerhalder"], //quizObj[2].choice[0],quizObj[2].choice[1]
"correct": ["Ian Somerhalder"]
},
{
"question": "What is the name of the largest planet in the universe?",
"choice": ["Earth", "Jupiter", "Uranus"], //quizObj[2].choice[0],quizObj[2].choice[1]
"correct": ["Jupiter"]
},
{
"question": "What is the capital of New York?",
"choice": ["Manhattan", "NYC", "Albany"], //quizObj[2].choice[0],quizObj[2].choice[1]
"correct": ["Albany"]
},
{
"question": "How many bones does the human body have?",
"choice": ["109", "206", "114"], //quizObj[2].choice[0],quizObj[2].choice[1]
"correct": ["206"]
},
{
"question": "What is the alter ego of Batman?",
"choice": ["Bruce Banner", "Bruce Wayne", "Tony Stark"], //quizObj[2].choice[0],quizObj[2].choice[1]
"correct": ["Bruce Wayne"]
},
{
"question": "How many books are there in the Harry Potter series?",
"choice": ["7", "5", "8"], //quizObj[2].choice[0],quizObj[2].choice[1]
"correct": ["7"]
},
{
"question": "What is Naruto's surname?",
"choice": ["Sarutobi", "Uchiha", "Uzumaki"], //quizObj[2].choice[0],quizObj[2].choice[1]
"correct": ["Uzumaki"]
},
{
"question": "What is the name of Sherlock Holmes' partner?",
"choice": ["Peterson", "Watson", "Hanson"], //quizObj[2].choice[0],quizObj[2].choice[1]
"correct": ["Watson"]
},
];
var track = [];
var maxQues = prompt("How many questions do you want to answer?", "5");
var rand = Math.floor(Math.random() * maxQues);
var str='<h4>Answer all the questions</h4>';
for(var i=0;i<maxQues;i++){
var rand = Math.floor(Math.random() * maxQues);
str+=(i+1)+'. '+quizObj[rand].question+'<br>';
str+='<form><table>'+
'<tr><td id="a1"><input type="radio" id="rad" name="radio' + i + '"/>'+' '+quizObj[rand].choice[0]+'</td></tr>'+
'<tr><td id="a2"><input type="radio" id="rad" name="radio' + i + '" />'+' '+quizObj[rand].choice[1]+'</td></tr>'+
'<tr><td id="a3"><input type="radio" id="rad" name="radio' + i + '"/>'+' '+quizObj[rand].choice[2]+'</td></tr>'+
'</table></form><br>';
track[i]=rand;
}
str += '<input value="Submit" type="button" onclick="scoreMe()"><br><br>';
str += 'Score: <input id="score" type="text" size="8" ><br><br><br>';
document.getElementById('quesRes').innerHTML = str;
function scoreMe(){
var sum=0;
var check=document.getElementById("rad");
for(var j=0;j<maxQues;j++){
for(var k=0;k<3;k++){
if(check.checked===true){
if(quizObj[track[j]].choice[k]===quizObj[track[j]].correct[0]){
console.log('Works');
sum++;
}
}
}
}
document.getElementById('score').value = ((sum/maxQues)*100)+'%';
}
</script>
好吧,您并没有真正检查用户选择了哪些选项。您在 quizObj[track[j]].choice[k].checked
和 quizObj[track[j]].correct[0]
之间的比较并不是在比较您真正想要的。
quizObj[track[j]].choice[k].checked
returns undefined
,因为您正在尝试获取 属性 checked
或该数组中的元素。
要使测验有效,您需要通过访问多个 input
标签而不是您正在访问的数组来获取它们的值。如果您从 if
子句中删除 .checked
,您将向控制台记录您想要的内容。但是如果我没看错的话,那张支票不是你想要做的。
此外,您还输出 <td>
个具有相同 id
的元素,这是不符合语义的,只会让您以后遇到困难。
检查 this fiddle 以查看它是否正常工作。仅选择 1 个问题并查看控制台。
这里有多个问题。
我要做的第一件事是将值属性放在单选按钮上。
大概是这样的。
str+='<form><table>'+
'<tr><td id="a1"><input type="radio" name="radio' + i + '" value="'+quizObj[rand].choice[0]+'"/>'+' '+quizObj[rand].choice[0]+'</td></tr>'+
'<tr><td id="a2"><input type="radio" name="radio' + i + '" value="'+quizObj[rand].choice[1]+'" />'+' '+quizObj[rand].choice[1]+'</td></tr>'+
'<tr><td id="a3"><input type="radio" name="radio' + i + '" value="'+quizObj[rand].choice[2]+'"/>'+' '+quizObj[rand].choice[2]+'</td></tr>'+
'</table></form><br>';
如果没有值属性,我不确定您会将正确答案与什么进行比较。
现在介绍 scoreMe 函数。您正在检查 属性 对测验对象答案的检查,而不是 DOM 元素。您需要 select radio 元素并检查选中的 属性。如下所示:
function scoreMe(){
var sum=0;
for(var j=0;j<maxQues;j++){
var radios = document.getElementsByName('radio' + j),
rl = radios.length;
for(var i = 0; i < rl; i++){
if(radios[i].checked && radios[i].value === quizObj[j].correct[0]){
sum++;
}
}
}
document.getElementById('score').value = ((sum/maxQues)*100)+'%';
}
仍然存在逻辑问题,即重复的问题不会按预期得分。我要么在开始时进行检查以防止重复问题,要么为每个问题提供一个唯一标识符,该标识符可以通过 html 属性绑定到收音机。然后循环radio,根据这个属性找到他们的问题对象,而不是先循环问题对象props。
所以我正在尝试制作一个 quiz.html 文件,它会提示用户输入编号。他们想回答的问题。根据他们的输入,将生成随机问题。所以我知道它必须是一个循环,一直循环到 no。输入到警告框。 所以我的 scoreMe() 函数显然没有给出任何答案。我正在尝试检查某个特定问题的选中单选按钮是否等于正确答案,但我的分数仅为 0%。那么谁能告诉我我的代码有什么问题吗?
<div id="quesRes"></div>
<script>
var quizObj = [
{
"question": "What is the capital of Bangladesh?",
"choice": ["Dhaka", "Chittagong", "Sylhet"],
"correct": ["Dhaka"]
},
{
"question": "What does 2+2 equal to?",
"choice": ["3", "2", "4"], //quizObj[2].choice[0],quizObj[2].choice[1]
"correct": ["4"]
},
{
"question": "What is the real name of Damon Salvatore?",
"choice": ["Paul Wesley", "Steven McQueen", "Ian Somerhalder"], //quizObj[2].choice[0],quizObj[2].choice[1]
"correct": ["Ian Somerhalder"]
},
{
"question": "What is the name of the largest planet in the universe?",
"choice": ["Earth", "Jupiter", "Uranus"], //quizObj[2].choice[0],quizObj[2].choice[1]
"correct": ["Jupiter"]
},
{
"question": "What is the capital of New York?",
"choice": ["Manhattan", "NYC", "Albany"], //quizObj[2].choice[0],quizObj[2].choice[1]
"correct": ["Albany"]
},
{
"question": "How many bones does the human body have?",
"choice": ["109", "206", "114"], //quizObj[2].choice[0],quizObj[2].choice[1]
"correct": ["206"]
},
{
"question": "What is the alter ego of Batman?",
"choice": ["Bruce Banner", "Bruce Wayne", "Tony Stark"], //quizObj[2].choice[0],quizObj[2].choice[1]
"correct": ["Bruce Wayne"]
},
{
"question": "How many books are there in the Harry Potter series?",
"choice": ["7", "5", "8"], //quizObj[2].choice[0],quizObj[2].choice[1]
"correct": ["7"]
},
{
"question": "What is Naruto's surname?",
"choice": ["Sarutobi", "Uchiha", "Uzumaki"], //quizObj[2].choice[0],quizObj[2].choice[1]
"correct": ["Uzumaki"]
},
{
"question": "What is the name of Sherlock Holmes' partner?",
"choice": ["Peterson", "Watson", "Hanson"], //quizObj[2].choice[0],quizObj[2].choice[1]
"correct": ["Watson"]
},
];
var track = [];
var maxQues = prompt("How many questions do you want to answer?", "5");
var rand = Math.floor(Math.random() * maxQues);
var str='<h4>Answer all the questions</h4>';
for(var i=0;i<maxQues;i++){
var rand = Math.floor(Math.random() * maxQues);
str+=(i+1)+'. '+quizObj[rand].question+'<br>';
str+='<form><table>'+
'<tr><td id="a1"><input type="radio" id="rad" name="radio' + i + '"/>'+' '+quizObj[rand].choice[0]+'</td></tr>'+
'<tr><td id="a2"><input type="radio" id="rad" name="radio' + i + '" />'+' '+quizObj[rand].choice[1]+'</td></tr>'+
'<tr><td id="a3"><input type="radio" id="rad" name="radio' + i + '"/>'+' '+quizObj[rand].choice[2]+'</td></tr>'+
'</table></form><br>';
track[i]=rand;
}
str += '<input value="Submit" type="button" onclick="scoreMe()"><br><br>';
str += 'Score: <input id="score" type="text" size="8" ><br><br><br>';
document.getElementById('quesRes').innerHTML = str;
function scoreMe(){
var sum=0;
var check=document.getElementById("rad");
for(var j=0;j<maxQues;j++){
for(var k=0;k<3;k++){
if(check.checked===true){
if(quizObj[track[j]].choice[k]===quizObj[track[j]].correct[0]){
console.log('Works');
sum++;
}
}
}
}
document.getElementById('score').value = ((sum/maxQues)*100)+'%';
}
</script>
好吧,您并没有真正检查用户选择了哪些选项。您在 quizObj[track[j]].choice[k].checked
和 quizObj[track[j]].correct[0]
之间的比较并不是在比较您真正想要的。
quizObj[track[j]].choice[k].checked
returns undefined
,因为您正在尝试获取 属性 checked
或该数组中的元素。
要使测验有效,您需要通过访问多个 input
标签而不是您正在访问的数组来获取它们的值。如果您从 if
子句中删除 .checked
,您将向控制台记录您想要的内容。但是如果我没看错的话,那张支票不是你想要做的。
此外,您还输出 <td>
个具有相同 id
的元素,这是不符合语义的,只会让您以后遇到困难。
检查 this fiddle 以查看它是否正常工作。仅选择 1 个问题并查看控制台。
这里有多个问题。
我要做的第一件事是将值属性放在单选按钮上。
大概是这样的。
str+='<form><table>'+
'<tr><td id="a1"><input type="radio" name="radio' + i + '" value="'+quizObj[rand].choice[0]+'"/>'+' '+quizObj[rand].choice[0]+'</td></tr>'+
'<tr><td id="a2"><input type="radio" name="radio' + i + '" value="'+quizObj[rand].choice[1]+'" />'+' '+quizObj[rand].choice[1]+'</td></tr>'+
'<tr><td id="a3"><input type="radio" name="radio' + i + '" value="'+quizObj[rand].choice[2]+'"/>'+' '+quizObj[rand].choice[2]+'</td></tr>'+
'</table></form><br>';
如果没有值属性,我不确定您会将正确答案与什么进行比较。
现在介绍 scoreMe 函数。您正在检查 属性 对测验对象答案的检查,而不是 DOM 元素。您需要 select radio 元素并检查选中的 属性。如下所示:
function scoreMe(){
var sum=0;
for(var j=0;j<maxQues;j++){
var radios = document.getElementsByName('radio' + j),
rl = radios.length;
for(var i = 0; i < rl; i++){
if(radios[i].checked && radios[i].value === quizObj[j].correct[0]){
sum++;
}
}
}
document.getElementById('score').value = ((sum/maxQues)*100)+'%';
}
仍然存在逻辑问题,即重复的问题不会按预期得分。我要么在开始时进行检查以防止重复问题,要么为每个问题提供一个唯一标识符,该标识符可以通过 html 属性绑定到收音机。然后循环radio,根据这个属性找到他们的问题对象,而不是先循环问题对象props。