Avatar billede Skaugir Nybegynder
25. maj 2016 - 12:28 Der er 7 kommentarer og
1 løsning

Tælle antal korrekte svar i quiz

Hej

Jeg er ved at lave en template til en quiz baseret på noget kode jeg har fundet på CodePen. Templaten skal kunne indeholde 10 spørgsmål og når man er igennem dem alle får man med nogle farvekoder vist hvilke spørgsmål der er korrekte og hvilke der er forkerte. Jeg ville dog gerne supplere med at der også blev optalt hvor mange man har rigtige.

Hvordan kan man lave en counter i javascript der tæller antal rigtige svar ud af antal mulige?

Koden der generes når man er færdig med quizzen. Kan det bruges eller vil I se mere?

<div class="false">1</div><div class="correct">2</div><div class="correct">3</div><div class="false">4</div><div class="false">5</div><div class="false">6</div><div class="false">7</div><div class="false">8</div><div class="correct">9</div><div class="false">10</div></div
Avatar billede olsensweb.dk Ekspert
25. maj 2016 - 13:49 #1
jeg vil gerne se noget mere.
kom med et link til online vertionen
kom evt med et link til hvilke der er du har taget fra CodePen. jeg kan se der ligger rigtig mange
http://codepen.io/search/pens/?depth=everything&limit=all&order=popularity&page=1&q=quiz&show_forks=false


noget der ville kune ses af coden er:
bruges der jquery i forvejen ??
Avatar billede Skaugir Nybegynder
25. maj 2016 - 14:11 #2
Jeg har ikke lagt den online, men det var denne pen;

https://codepen.io/elliotpage/pen/vGMpjg

Den ser dog ikke ud til at virke nu? Det gjorde den i går.
Avatar billede olsensweb.dk Ekspert
25. maj 2016 - 15:39 #3
>Den ser dog ikke ud til at virke nu? Det gjorde den i går.
hvordan ser dit js ud ??, det må jo virke (ellers har du jo en backup)



hvis man starter med at downloade filerne, ( export -> export.zip) skal man lige lave html valid.
der er et problem med js ses i browserens debugger "index.js:26 Uncaught ReferenceError: allQuestions is not defined"
fejlen er pga scope regler:

loadQuestion(); skal være loadQuestion(current);
og svarene bliver ikke kaldt
Avatar billede Skaugir Nybegynder
25. maj 2016 - 15:52 #4
Hmm, jeg vidste faktisk ikke at der var en eksport-mulighed så jeg har taget koden ud manuelt og oprettet hhv. en html, css og js-fil. Fra head i html'en henviser jeg til de to andre filer. Og det virker fint efter hensigten. Min js ser således ud;

window.onload = function () {
 
  var questionArea = document.getElementsByClassName('questions')[0],
      answerArea  = document.getElementsByClassName('answers')[0],
      checker      = document.getElementsByClassName('checker')[0],
      current      = 0,
 
    // An object that holds all the questions + possible answers.
    // In the array --> last digit gives the right answer position
      allQuestions = {
        'Superunknown' : ['Alice In Chains', 'Soundgarden', 'Stone Temple Pilots','Nine Inch Nails', 1],
       
        'Music for the Jilted Generation' : ['Chemical Brothers', 'The Prodigy', 'Portishead', 1],
       
        'Thug Life: Volume 1' : ['Naughty By Nature', 'Kris Kross', '2Pac', 2],
       
        'Pisces Iscariot' : ['Smashing Pumpkins', 'Pearl Jam', 'Pixies', 0],
       
        'Steam' : ['Take That', 'East 17' , 'Boyzone', 1],
       
        'Youthanasia ' : ['Metallica', 'Slayer', 'Megadeth', 2],
       
        'The Return of the Space Cowboy' : ['Jamiroquai', 'Primus', 'Stevie Wonder', 0],
       
        'Dog Man Star' : ['Suede', 'Sort Sol', 'Weezer', 0],
       
        'No Need to Argue' : ['The Cranberries', 'Morrissey' , 'Pulp', 0],
       
        'Burn My Eyes' : ['Korn', 'Anthrax?', 'Machine Head', 2],
      };
     
  function loadQuestion(curr) {
  // This function loads all the question into the questionArea
  // It grabs the current question based on the 'current'-variable
 
    var question = Object.keys(allQuestions)[curr];
   
    questionArea.innerHTML = '';
    questionArea.innerHTML = question;   
  }
 
  function loadAnswers(curr) {
  // This function loads all the possible answers of the given question
  // It grabs the needed answer-array with the help of the current-variable
  // Every answer is added with an 'onclick'-function
 
    var answers = allQuestions[Object.keys(allQuestions)[curr]];
   
    answerArea.innerHTML = '';
   
    for (var i = 0; i < answers.length -1; i += 1) {
      var createDiv = document.createElement('div'),
          text = document.createTextNode(answers[i]);
     
      createDiv.appendChild(text);     
      createDiv.addEventListener("click", checkAnswer(i, answers));
     
     
      answerArea.appendChild(createDiv);
    }
  }
 
  function checkAnswer(i, arr) {
    // This is the function that will run, when clicked on one of the answers
    // Check if givenAnswer is sams as the correct one
    // After this, check if it's the last question:
    // If it is: empty the answerArea and let them know it's done.
   
    return function () {
      var givenAnswer = i,
          correctAnswer = arr[arr.length-1];
     
      if (givenAnswer === correctAnswer) {
        addChecker(true);           
      } else {
        addChecker(false);                       
      }
     
      if (current < Object.keys(allQuestions).length -1) {
        current += 1;
       
        loadQuestion(current);
        loadAnswers(current);
      } else {
        questionArea.innerHTML = 'Færdigt arbejde';
        answerArea.innerHTML = 'Du fik X ud af Y rigtige</br> <input type="button" value="Prøv igen" onClick="window.location.reload()">';
      }
                             
    };
  }
 
  function addChecker(bool) {
  // This function adds a div element to the page
  // Used to see if it was correct or false
 
    var createDiv = document.createElement('div'),
        txt      = document.createTextNode(current + 1);
   
    createDiv.appendChild(txt);
   
    if (bool) {
     
      createDiv.className += 'correct';
      checker.appendChild(createDiv);
    } else {
      createDiv.className += 'false';
      checker.appendChild(createDiv);
    }
  }
 
 
  // Start the quiz right away
  loadQuestion(current);
  loadAnswers(current);
 
};
Avatar billede olsensweb.dk Ekspert
25. maj 2016 - 16:58 #5
en quick fix, kunne du tælle antallet af classen "correct" og ligge 1 til current
ændringer fremhævet

 
window.onload = function () {

    var questionArea = document.getElementsByClassName('questions')[0],
            answerArea = document.getElementsByClassName('answers')[0],
            checker = document.getElementsByClassName('checker')[0],
            current = 0,
            // An object that holds all the questions + possible answers.
            // In the array --> last digit gives the right answer position
            allQuestions = {
                'Superunknown': ['Alice In Chains', 'Soundgarden', 'Stone Temple Pilots', 'Nine Inch Nails', 1],
                'Music for the Jilted Generation': ['Chemical Brothers', 'The Prodigy', 'Portishead', 1],
                'Thug Life: Volume 1' : ['Naughty By Nature', 'Kris Kross', '2Pac', 2],
                'Pisces Iscariot' : ['Smashing Pumpkins', 'Pearl Jam', 'Pixies', 0],
                'Steam' : ['Take That', 'East 17' , 'Boyzone', 1],
                'Youthanasia ' : ['Metallica', 'Slayer', 'Megadeth', 2],
                'The Return of the Space Cowboy' : ['Jamiroquai', 'Primus', 'Stevie Wonder', 0],
                'Dog Man Star' : ['Suede', 'Sort Sol', 'Weezer', 0],
                'No Need to Argue' : ['The Cranberries', 'Morrissey' , 'Pulp', 0],
                'Burn My Eyes': ['Korn', 'Anthrax?', 'Machine Head', 2],
            };

    function loadQuestion(curr) {
        // This function loads all the question into the questionArea
        // It grabs the current question based on the 'current'-variable

        var question = Object.keys(allQuestions)[curr];

        questionArea.innerHTML = '';
        questionArea.innerHTML = question;
    }

    function loadAnswers(curr) {
        // This function loads all the possible answers of the given question
        // It grabs the needed answer-array with the help of the current-variable
        // Every answer is added with an 'onclick'-function

        var answers = allQuestions[Object.keys(allQuestions)[curr]];

        answerArea.innerHTML = '';

        for (var i = 0; i < answers.length - 1; i += 1) {
            var createDiv = document.createElement('div'),
                    text = document.createTextNode(answers[i]);

            createDiv.appendChild(text);
            createDiv.addEventListener("click", checkAnswer(i, answers));


            answerArea.appendChild(createDiv);
        }
    }


    function CalcCorrect() {
        var correct = document.getElementsByClassName("correct").length;       
        // var wrong =  document.getElementsByClassName("false").length;
        // var OutOff = correct + wrong;
        // return {correct:1, OutOff:5};
        var OutOf = current+1; // da vi starter med 0
        return {correct: correct, OutOf: OutOf};
    }


    function checkAnswer(i, arr) {
        // This is the function that will run, when clicked on one of the answers
        // Check if givenAnswer is sams as the correct one
        // After this, check if it's the last question:
        // If it is: empty the answerArea and let them know it's done.

        return function () {
            var givenAnswer = i,
                    correctAnswer = arr[arr.length - 1];

            if (givenAnswer === correctAnswer) {
                addChecker(true);
            } else {
                addChecker(false);
            }

            if (current < Object.keys(allQuestions).length - 1) {
                current += 1;

                loadQuestion(current);
                loadAnswers(current);
            } else {
                // added
                var obj = CalcCorrect();
               

                questionArea.innerHTML = 'Færdigt arbejde';
                // answerArea.innerHTML = 'Du fik X ud af Y rigtige</br> <input type="button" value="Prøv igen" onClick="window.location.reload()">';
                answerArea.innerHTML = 'Du fik ' + obj.correct + ' ud af ' + obj.OutOf + ' rigtige</br> <input type="button" value="Prøv igen" onClick="window.location.reload()">';
            }

        };
    }

    function addChecker(bool) {
        // This function adds a div element to the page
        // Used to see if it was correct or false

        var createDiv = document.createElement('div'),
                txt = document.createTextNode(current + 1);

        createDiv.appendChild(txt);

        if (bool) {

            createDiv.className += 'correct';
            checker.appendChild(createDiv);
        } else {
            createDiv.className += 'false';
            checker.appendChild(createDiv);
        }
    }


    // Start the quiz right away
    loadQuestion(current);
    loadAnswers(current);

};
Avatar billede olsensweb.dk Ekspert
25. maj 2016 - 17:22 #6
måske en pænere løsning, er ikke at bruge en function til at beregne antal rigtige
så skal function'en  CalcCorrect() slattes og checkAnswer() bare se sådan ud
 
function checkAnswer(i, arr) {
    // This is the function that will run, when clicked on one of the answers
    // Check if givenAnswer is sams as the correct one
    // After this, check if it's the last question:
    // If it is: empty the answerArea and let them know it's done.

    return function () {
        var givenAnswer = i,
                correctAnswer = arr[arr.length - 1];

        if (givenAnswer === correctAnswer) {
            addChecker(true);
        } else {
            addChecker(false);
        }

        if (current < Object.keys(allQuestions).length - 1) {
            current += 1;

            loadQuestion(current);
            loadAnswers(current);
        } else {
            // added
            var correct = document.getElementsByClassName("correct").length;       

            questionArea.innerHTML = 'Færdigt arbejde';
            // answerArea.innerHTML = 'Du fik X ud af Y rigtige</br> <input type="button" value="Prøv igen" onClick="window.location.reload()">';
            answerArea.innerHTML = 'Du fik ' + correct + ' ud af ' + (current+1) + ' rigtige</br> <input type="button" value="Prøv igen" onClick="window.location.reload()">';
        }

    };
}
Avatar billede Skaugir Nybegynder
26. maj 2016 - 07:56 #7
Det virkede :-). Mange tusind tak!
Avatar billede olsensweb.dk Ekspert
26. maj 2016 - 21:14 #8
og et svar fra mig
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester