如何检查我的单选按钮是否已被选中并且循环是否正常工作?

时间:2015-01-21 13:20:56

标签: javascript html arrays loops radio-button

所以我正在尝试创建一个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 + '"/>'+'&nbsp;&nbsp;'+quizObj[rand].choice[0]+'</td></tr>'+
            '<tr><td id="a2"><input type="radio" id="rad" name="radio' + i + '" />'+'&nbsp;&nbsp;'+quizObj[rand].choice[1]+'</td></tr>'+
            '<tr><td id="a3"><input type="radio" id="rad" name="radio' + i + '"/>'+'&nbsp;&nbsp;'+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>

2 个答案:

答案 0 :(得分:0)

嗯,你并没有真正检查用户选择的选项。您在quizObj[track[j]].choice[k].checkedquizObj[track[j]].correct[0]之间的比较并不是比较您真正想要的。

quizObj[track[j]].choice[k].checked会返回undefined,因为您正在尝试获取属性checked或该数组中的元素。

要使测验有效,您需要通过访问它们来获取多个input标记的值,而不是您正在访问的数组。如果从.checked子句中删除if,则表示您要将所需内容记录到控制台。但是如果我把它正确的话,那个检查不是你想做的。

此外,您还输出了<td>id元素,这些元素具有相同的{{1}},这是非语义的,只会让您在路上遇到困难。

检查this fiddle是否有效。只挑选一个问题并查看控制台。

答案 1 :(得分:0)

这里有多个问题。

我要做的第一件事就是将值属性放在你的单选按钮上。

可能是这样的。

str+='<form><table>'+
        '<tr><td id="a1"><input type="radio" name="radio' + i + '" value="'+quizObj[rand].choice[0]+'"/>'+'&nbsp;&nbsp;'+quizObj[rand].choice[0]+'</td></tr>'+
        '<tr><td id="a2"><input type="radio" name="radio' + i + '" value="'+quizObj[rand].choice[1]+'" />'+'&nbsp;&nbsp;'+quizObj[rand].choice[1]+'</td></tr>'+
        '<tr><td id="a3"><input type="radio" name="radio' + i + '" value="'+quizObj[rand].choice[2]+'"/>'+'&nbsp;&nbsp;'+quizObj[rand].choice[2]+'</td></tr>'+
    '</table></form><br>';

没有价值属性,我不确定你会比较正确的答案。

现在进入scoreMe功能。您正在检查测验对象的答案而不是DOM元素上的已检查属性。您需要选择无线电元素并检查其中的已检查属性。如下所示:

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属性的无线电绑定。然后循环收音机并根据此属性找到问题对象,而不是首先循环问题对象道具。