HiveBrain v1.2.0
Get Started
← Back to all entries
patternjavascriptMinor

Basic JavaScript quiz app

Submitted by: @import:stackexchange-codereview··
0
Viewed 0 times
javascriptquizbasicapp

Problem

I struggled my way through the first quiz and here are the results. Since I have some experience in jQuery I really wanted to use only vanilla JavaScript. I know the code is pretty choppy and there is most likely a lot of room for improvement.

How can I make this code more succinct? What are some better practices that i can implement?

Here is a jsfiddle.

HTML:


    
         How well do you know Matt
    
    


JavaScript:

```
var allQuestions = [
{
question: "What is Matt favorite color?",
choices: ["Blue", "Black", "Yellow", "Blank", "Clear" ],
correctAnswer: 4
},
{
question: "Who is Matt's Favorite fiction Author?",
choices: ["Brennan Manning", "JD Salinger", "Stephen King", "Jack Kerouac"],
correctAnswer: 3
},
{
question: "What is Matt's favorite food?",
choices: ["Pizza", "Wings", "Mexican", "Rally's"],
correctAnswer: 0
}
];

var submitBtn = document.getElementById('myBtn');
var currentQuestion = 0;
var tally = 0;

var quizForm = document.getElementById('quiz');
var question;
var choices;
var radioButtons = document.getElementsByName('radioOption');
var index = 0;

function firstFunc() {
if (currentQuestion === 0) {
submitBtn.value = "Start Quiz";
}
}

function askQuestion () {
choices = allQuestions[currentQuestion].choices;
question = allQuestions[currentQuestion].question;
if (currentQuestion " + question + "";
for (var i = 0; i " + choices[i] + "";
}
if (currentQuestion == allQuestions.length - 1) {
submitBtn.value = "Submit";
} else if (currentQuestion > allQuestions.length - 1) {
calcQuiz();
}
}
}

function lookForChecked() {

if (radioButtons.length > 1) {

var checked = false;
for (var i = 0; i You have finished the quizYou scored a total of " + tally + " out of " + allQuestions.length + "";
submitBtn.remove();
}
window.onload = firstFunc();
submitBtn.addEventListener('click', lo

Solution

Design

You could remake this using Object-Oriented-Programming. For example, you could make a Question object, like this.

function Question(description, choices, correctChoiceIndex) {
    this.description = description;
    this.choices = choices;
    this.correctChoiceIndex = correctChoiceIndex;
}


You could then extend it with some methods, like askQuestion. For example, you could do something like this (Using prompt and alert because I'm on mobile.)

Question.prototype.askQuestion = function() {
    return prompt("Choices:\n" + this.choices.join("\n"));
}


You could then supply an additional method, checkAnswer, to see if the user got the answer correct.

Question.prototype.checkAnswer = function() {
    if(parseInt(this.askQuestion(), 10) === this.correctChoiceIndex) {
        alert("You got the question right!");
    }
    else {
        alert("Sorry, wrong answer.");
    }
}


Nitpicks

Some of your naming is not great. For example, firstFunc is an awful name for a function. It doesn't describe the purpose of the function in any way.

Preferably, names for variables/functions/classes should exhibit the following characteristics:

  • Describe the variable/function/class in detail.



  • Not have unnecessary abbreviations.



  • Not be too short.



  • Not be too long. (Unless you're programming in objective-c.)



Most of your variable names exhibit these characteristics, I just saw a few, like submitBtn that could be expanded to something like submitButton.

Moving on, I saw this line I your code:

var index = [i];


It isn't used anywhere in it's scope, and even if it was used, it would serve no purpose at this point.

Finally, when using the increment, ++, and decrement, -- operators, remember the differences between how they're placed.

Code Snippets

function Question(description, choices, correctChoiceIndex) {
    this.description = description;
    this.choices = choices;
    this.correctChoiceIndex = correctChoiceIndex;
}
Question.prototype.askQuestion = function() {
    return prompt("Choices:\n" + this.choices.join("\n"));
}
Question.prototype.checkAnswer = function() {
    if(parseInt(this.askQuestion(), 10) === this.correctChoiceIndex) {
        alert("You got the question right!");
    }
    else {
        alert("Sorry, wrong answer.");
    }
}
var index = [i];

Context

StackExchange Code Review Q#98678, answer score: 3

Revisions (0)

No revisions yet.