Witam, mam kod mini quizu, napisany w celach treningowych:
  1. var App = (function() {
  2. var _questions = [],
  3. _askedQ = [],
  4. _currentRound = 1,
  5. _score = 0,
  6. $quiz = document.getElementById('quiz'),
  7. $question = document.getElementById('question'),
  8. $answers = document.getElementById('answers'),
  9. $score = document.getElementById('score'),
  10. $startBtn = document.getElementById('start');
  11.  
  12. _questions.push({ q: 'Czy Maria to imię damskie', a : { 'tak' : 1, 'nie' : 0 } });
  13. _questions.push({ q: 'Czy Marek to imię damskie', a : { 'tak' : 0, 'nie' : 1 } });
  14. _questions.push({ q: 'Czy Kasia to imię damskie', a : { 'tak' : 1, 'nie' : 0 } });
  15. _questions.push({ q: 'Czy A == B', a : { 'tak' : 0, 'nie wiem :)' : 0, 'nie' : 1 } });
  16. _lastRound = 0;
  17.  
  18. return {
  19. start : function() {
  20. $startBtn.style.display = 'none';
  21. _lastRound = parseInt(window.prompt('Podaj liczbę rund'),10);
  22. if(_lastRound > 0 && _lastRound <= _questions.length)
  23. {
  24. $quiz.style.display = 'block';
  25. this.loadRound(_currentRound);
  26. }
  27. else
  28. {
  29. alert('Niepoprawna liczba rund!');
  30. }
  31. },
  32. init : function() {
  33. //console.log($that);
  34. this.addEvent($startBtn,'click',function(){ this.start(); });
  35. },
  36. loadRound : function(no)
  37. {
  38. if(no > _lastRound)
  39. {
  40. this.end();
  41. }
  42. else
  43. {
  44. var questionNo,
  45. question = null;
  46. do {
  47. questionNo = Math.floor(Math.random()*(_lastRound));
  48. }
  49. while(this.notAsked(questionNo) === false); //losuj dopoki nie zadasz nieuzytego pytania
  50.  
  51. //console.log(_lastRound);
  52. _askedQ.push(questionNo);
  53. question = _questions[questionNo];
  54.  
  55. //console.log(questionNo);
  56. $question.innerHTML = question.q+'?';
  57. $answers.innerHTML = '';
  58. var tempLi;
  59. var tempLiData;
  60. var id;
  61.  
  62. for(var ans in question.a)
  63. {
  64. tempLi = document.createElement('li');
  65. tempLi.innerHTML = ans;
  66.  
  67. this.addEvent(tempLi,'click',function(){ this.answer(question.a[ans]); });
  68.  
  69. $answers.appendChild(tempLi);
  70. }
  71. $score.innerHTML = 'Aktualny wynik: '+_score;
  72. }
  73. },
  74. answer : function(choice) {
  75. ++_currentRound;
  76. console.log(choice);
  77.  
  78. if(parseInt(choice,10) == 1)
  79. {
  80. _score = parseFloat(_score+1);
  81. }
  82. else
  83. {
  84. _score = parseFloat(_score-0.5);
  85. }
  86. this.loadRound(_currentRound);
  87. },
  88. end : function() {
  89. alert('Twój wynik to '+_score+' pkt');
  90. document.writeln('Quiz zakończony, odśwież stronę, by spróbować jeszcze raz');
  91. },
  92. notAsked : function(no) {
  93. return _askedQ.indexOf(no) == -1 ? true : false;
  94. },
  95. addEvent : function(object, eventName, callback)
  96. {
  97. if(object !== null)
  98. {
  99. if (object.addEventListener)
  100. {
  101. object.addEventListener(eventName, callback.bind(this), false);
  102. }
  103. else
  104. {
  105. object.attachEvent("on"+eventName, callback.bind(this));
  106. }
  107. }
  108. }
  109. }
  110. });
  111.  
  112. var quiz = new App();
  113. quiz.init();


Problem występuje w lini 67.
  1. 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:
  1. <!DOCTYPE HTML>
  2. <meta charset="utf-8">
  3. <meta name="description" content="Opis strony">
  4. <meta name="keywords" content="pierwsza, strona">
  5. <link rel="stylesheet" type="text/css" href="style.css">
  6. <title>Lab 5</title>
  7. </head>
  8. <section>
  9. <header>
  10. <h1>Quiz</h1>
  11. </header>
  12. <section id="quiz">
  13. <p id="question"></p>
  14. <ul id="answers">
  15. <li></li>
  16. </ul>
  17. <span id="score"></span>
  18. </section>
  19. <button id="start">Zacznij quiz!</button>
  20. </section>
  21. <script type="text/javascript" src="main.js"></script>
  22. </body>
  23. </html>

Z góry dziękuję za pomoc.