Witam, mam kod mini quizu, napisany w celach treningowych:
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>
<meta name="description" content="Opis strony"> <meta name="keywords" content="pierwsza, strona"> <link rel="stylesheet" type="text/css" href="style.css"> <section>
<header>
</header>
<section id="quiz">
</section>
</section>
Z góry dziękuję za pomoc.