试图从测验中取回一个分数

时间:2016-03-20 23:53:06

标签: javascript html

由于某种原因,只有得分0想要增加。虽然这两个for循环似乎相同(如果我错了,真的很抱歉)。因此,totScore只从score0变量中获取值。但是当然我希望totScore从两个变量中获得价值,以便得到测验的总分。

另外,为什么在我写score0 += 1;时为score0变量添加4,这对我没有任何意义。

如果您更改我的代码,请不要使用任何JQuery。 谢谢!

<!DOCTYPE html>
<html>
<body>
<form id='quizForm'>
    <ul>
        <li>
            <h3>How many letters are there in 'FB'?</h3>
            <input type="radio" name="question0" value="A" />2<br>
            <input type="radio" name="question0" value="B" />1<br>
            <input type="radio" name="question0" value="C" />3<br>
            <input type="radio" name="question0" value="D" />4<br>
        </li>
    </ul>
    <ul>
        <li>
            <h3>How many letters are there in 'IBM'?</h3>
            <input type="radio" name="question1" value="A" />2<br>
            <input type="radio" name="question1" value="B" />1<br>
            <input type="radio" name="question1" value="C" />3<br>
            <input type="radio" name="question1" value="D" />4<br>
        </li>
    </ul>
</form>

<button onclick="showScore()">Show results
</button>
        <script>    
        //Score and answer variables
        var score1 = 0;
        var score0 = 0;
        var totScore = 0;
        var answers = ["A","C"]
//function to calculate the score.
function getScore() {
    // some arrays and stuff
    userInput1 = new Array(10);
    userInput0 = new Array(10);
    var question0s = document.getElementsByName("question0");

   //for loop to see which radio was checked
   for (var i = 0; i < question0s.length; i++) {
        if (question0s[i].checked) {
            userInput0[0] = question0s[i].value;
    }
    if (userInput0[0] == answers[0]) {
        // Only god knows why the hell I have to divide 4
       score0 += 1 / 4;
    }
    else if (userInput0[0] != answers [0]){
        //so that user can't just switch back and fourth from inputs to get higher score.
        score0 -= 1 ;
    }
    }
    //if user has changed her answer multiple times she will get an answer with a negative value. I don't want that, so if score is less than 0 it turns to 0.
    if (score0 < 0){
        score0 = score0 * 0;
    }

    var question1s = document.getElementsByName("question1");
   //for loop to see which radio was checked
   for (var y = 0; y < question1s.length; y++) {
        if (question1s[y].checked) {
            userInput1[0] = question1[y].value;
    }
    if (userInput1[0] == answers[0]) {
       score1 += 1;
    }
    else if (userInput1[0] != answers [0]){
    //so that user can't just switch back and fourth from inputs to get higher score.
        score1 -= 1 ;
    }
    }
    if (score1 < 0){
        //if user has changed her answer multiple times she will get an answer with a negative value. I don't want that, so if score is less than 0 it turns to 0.
        score1 = score1 * 0;
    }
    //getting score from all different questions
    totScore += score1 + score0;
}
//checking for changes in the form
var quizForm = document.getElementById('quizForm');
quizForm.addEventListener("change", function(){
    getScore();
});


// onclick function
function showScore (){
    alert (totScore);
}
    </script>
</body>
</html>

2 个答案:

答案 0 :(得分:0)

至于为什么没有得到正确的处理,这里有一个无效的变量question1

userInput1[0] = question1[y].value;

现在让我们解决这个问题并做得更好。

首先,你有许多全局变量,所以让我们在一个简单的命名空间下得到它并称之为quiz

从标记中获取点击处理程序并为其创建一个侦听器。

现在,至于你的逻辑,你正在循环通过单选按钮。现在单选按钮的工作方式是只能选择一个,所以我们可以使用它,而不是根本不进行循环。

使用单选按钮,如果尚未选择一个,那么使用我们的新选择技术它将为NULL,因此我们可以使用它来判断两个问题是否都已被回答,然后如果这是真的,我们可以将分数否则,他们得不到任何分数(分数为0),直到所有问题都被回答(非空)。

//Score and answer variables=
 var quiz = {
   score0: 0,
   score1: 0,
   totalScore: 0,
   answers: ["A", "C"],
   maxScore: 2,
   tries: 0
 };
 //function to calculate the score.
 function getScore() {
   var answer0 = document.querySelector('input[name="question0"]:checked');
   quiz.score0 = answer0 != null && quiz.answers[0] == answer0.value ? 1 : 0;
   var answer1 = document.querySelector('input[name="question1"]:checked');
   quiz.score1 = answer1 != null && quiz.answers[1] == answer1.value ? 1 : 0;
   // if either is null, not all answered
   if (answer0 != null && answer1 != null) {
     // if previous tries, subtract how many
     if (quiz.tries) {
       quiz.totalScore = quiz.totalScore ? quiz.totalScore - quiz.tries : 0;
       quiz.totalScore = quiz.totalScore < 0 ? 0 : quiz.totalScore ;//0 if negative
     } else {
       quiz.totalScore = quiz.score1 + quiz.score0;
     }
     quiz.tries++;
   }
 }
 // onclick function
 function showScore() {
   alert(quiz.totalScore + " in tries: " + quiz.tries);
 }
 // add listeners
 //checking for changes in the form
 var quizForm = document.getElementById('quizForm');
 quizForm.addEventListener("change", function() {
   getScore();
 });
 var resultButton = document.getElementById('results');
 resultButton.addEventListener("click", function() {
   showScore();
 });

在此尝试以上内容:https://jsfiddle.net/MarkSchultheiss/qx4hLjLq/2/

你可以通过把它放在quiz这样的东西中来做更多的事情:

 //Score and answer variables=
 var quiz = {
   totalScore: 0,
   tries: 0,
   maxScore: 2,
   answered: 0,
   questions: [{
     question: {},
     name: "question0",
     score: 0,
     answer: "A"
   }, {
     question: {},
     name: "question1",
     score: 0,
     answer: "C"
   }],
   checkQuestion: function(q) {
     q.score = q.question != null && q.answer == q.question.value ? 1 : 0;
   },
   //function to calculate the score.
   getScore: function() {
     this.answered = 0;
     for (var i = 0; i < this.questions.length; i++) {
       var sel = 'input[name="' + this.questions[i].name + '"]:checked';
       this.questions[i].question = document.querySelector(sel);
       this.checkQuestion(this.questions[i]);
       this.answered = this.questions[i].question ? this.answered + 1 : this.answered;
     }
     console.dir(this);

     // if either is null, not all answered
     if (this.answered == this.questions.length) {
       for (var i = 0; i < this.questions.length; i++) {
         this.totalScore = this.totalScore + this.questions[i].score;
       }
       if (this.tries) {
         this.totalScore = this.tries && this.totalScore ? this.totalScore - this.tries : 0;
         this.totalScore = this.totalScore < 0 ? 0 : this.totalScore; //0 if negative
       }
       this.tries++;
     }
   },

   // onclick function
   showScore: function() {
     var t = "";
     if (this.answered != this.questions.length) {
       t = "Not all questions ansered!"
     } else {
       t = this.totalScore + " in tries: " + this.tries;
     }
     alert(t);
   }
 };
 // add listeners
 //checking for changes in the form
 var quizForm = document.getElementById('quizForm');
 quizForm.addEventListener("change", function() {
   quiz.getScore();
 });
 var resultButton = document.getElementById('results');
 resultButton.addEventListener("click", function() {
   quiz.showScore();
 });

行动中的第二个例子:https://jsfiddle.net/MarkSchultheiss/qx4hLjLq/4/

答案 1 :(得分:0)

如果您只想从测试中获得结果,请使用以下代码:

<!DOCTYPE html>
<html>
<body>
    <ul>
        <li>
            <h3>How many letters are there in 'FB'?</h3>
            <input type="radio" name="question0"/>1<br>
            <input type="radio" name="question0"/>2<br>
            <input type="radio" name="question0"/>3<br>
            <input type="radio" name="question0"/>4<br>
        </li>
    </ul>
    <ul>
        <li>
            <h3>How many letters are there in 'IBM'?</h3>
            <input type="radio" name="question1"/>1<br>
            <input type="radio" name="question1"/>2<br>
            <input type="radio" name="question1"/>3<br>
            <input type="radio" name="question1"/>4<br>
        </li>
    </ul>
<button onclick="calculate()">Submit</button>
<script>
function calculate(){
    var answers = [1, 2];
    var score = 0;
    var question0s = document.getElementsByName("question0");
    var question1s = document.getElementsByName("question1");
    if (question0s[answers[0]].checked == true) {
        score++;
    }
    if (question1s[answers[1]].checked == true) {
        score++;
    }
    alert ("You got " + score + " out of " + answers.length + ".");
}
</script>
</body>
</html>

每次答案发生变化时,您似乎都在调用脚本,这样效率非常低。我只是在完成所有答案并且用户按下提交后才打电话。

之所以添加4次是因为如果你将第一个答案设置为A,它会将其写入userinput0并且不会再被更改,因为答案是唯一一个被检查的答案,并且它重复了有4个选项的数量,因此你重复了4个赋值语句,因此你添加了4个。