var App = (function() { var _questions = [], _askedQ = [], _currentRound = 1, _score = 0, $quiz = document.getElementById('quiz'), $question = document.getElementById('question'), $answers = document.getElementById('answers'), $score = document.getElementById('score'), $startBtn = document.getElementById('start'); _questions.push({ q: 'Czy Maria to imię damskie', a : { 'tak' : 1, 'nie' : 0 } }); _questions.push({ q: 'Czy Marek to imię damskie', a : { 'tak' : 0, 'nie' : 1 } }); _questions.push({ q: 'Czy Kasia to imię damskie', a : { 'tak' : 1, 'nie' : 0 } }); _questions.push({ q: 'Czy A == B', a : { 'tak' : 0, 'nie wiem :)' : 0, 'nie' : 1 } }); _lastRound = 0; return { start : function() { $startBtn.style.display = 'none'; _lastRound = parseInt(window.prompt('Podaj liczbę rund'),10); if(_lastRound > 0 && _lastRound <= _questions.length) { $quiz.style.display = 'block'; this.loadRound(_currentRound); } else { alert('Niepoprawna liczba rund!'); } }, init : function() { //console.log($that); this.addEvent($startBtn,'click',function(){ this.start(); }); }, loadRound : function(no) { if(no > _lastRound) { this.end(); } else { var questionNo, question = null; do { questionNo = Math.floor(Math.random()*(_lastRound)); } while(this.notAsked(questionNo) === false); //losuj dopoki nie zadasz nieuzytego pytania //console.log(_lastRound); _askedQ.push(questionNo); question = _questions[questionNo]; //console.log(questionNo); $question.innerHTML = question.q+'?'; $answers.innerHTML = ''; var tempLi; var tempLiData; var id; for(var ans in question.a) { tempLi = document.createElement('li'); tempLi.innerHTML = ans; this.addEvent(tempLi,'click',function(){ this.answer(question.a[ans]); }); $answers.appendChild(tempLi); } $score.innerHTML = 'Aktualny wynik: '+_score; } }, answer : function(choice) { ++_currentRound; console.log(choice); if(parseInt(choice,10) == 1) { _score = parseFloat(_score+1); } else { _score = parseFloat(_score-0.5); } this.loadRound(_currentRound); }, end : function() { alert('Twój wynik to '+_score+' pkt'); document.writeln('Quiz zakończony, odśwież stronę, by spróbować jeszcze raz'); }, notAsked : function(no) { return _askedQ.indexOf(no) == -1 ? true : false; }, addEvent : function(object, eventName, callback) { if(object !== null) { if (object.addEventListener) { object.addEventListener(eventName, callback.bind(this), false); } else { object.attachEvent("on"+eventName, callback.bind(this)); } } } } }); var quiz = new App(); quiz.init();
Problem występuje w lini 67.
this.addEvent(tempLi,'click',function(){ this.answer(question.a[ans]); });
Mianowicie chodzi o to, iż każda odpowiedź przyjmuje wartość ostatniej wymienionej w obiekcie pytania, tzn. gdy obiekt wygląda w ten sposób: { q: 'Czy A == B', a : { 'tak' : 0, 'nie wiem' : 0, 'nie' : 1 } }, to każda wyświetlona odpowiedź (zawierająca poprawny tekst odpowiedzi) wyśle do metody answer wartość 1, a powinna dla tak oraz nie wiem wysłać 0.
Co jest przyczyną takiego stanu rzeczy?
Dla ułatwienia podaję kod html strony, na której używam tego skryptu:
<!DOCTYPE HTML> <html> <head> <meta charset="utf-8"> <meta name="description" content="Opis strony"> <meta name="keywords" content="pierwsza, strona"> <link rel="stylesheet" type="text/css" href="style.css"> </head> <body> <section> <header> </header> <section id="quiz"> <ul id="answers"> </ul> </section> </section> </body> </html>
Z góry dziękuję za pomoc.