Aplikacja quiz w przeglądarce

0

Witam, mam mały problem z quizem taki iż nie wyświetla mi pytań ani odpowiedzi. Uczę się javyscript od paru tygodni więc nie wszystko wiem umiem niestety :(
HTML:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>

    <link rel="stylesheet" href="./styles/style.css">
    <link href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-GLhlTQ8iRABdZLl6O3oVMWSktQOp6b7In1Zl3/Jr59b6EGGoI1aFkw7cmDA6j6gD" crossorigin="anonymous">

    <script src="./classes/questions.js" defer></script>
    <script src="./classes/app.js" defer></script>
    <script src="./classes/answer.js" defer></script>
    <script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/js/bootstrap.bundle.min.js" integrity="sha384-w76AqPfDkMBDXo30jS1Sgez6pr3x5MlQ1ZAGC+nuZB+EYdgRZgiwxhTBTkF7CXvN" crossorigin="anonymous" defer></script>


</head>
<body class="bg-dark">

    <div class="container text-center bg-dark text-warning">
    <div class="quiz-container mx-auto" id="quiz">
        <div class="quiz-header">
            <h2 id="question">Question Text</h2>
            <ul>
                <li>
                    <input type="radio" name="answer" id="a" class="answer" >
                    <label for="a" id="a_text">Answer</label>
                </li>
                <li>
                    <input type="radio" name="answer" id="b" class="answer" >
                    <label for="b" id="b_text">Answer</label>
                </li>
                <li>
                    <input type="radio" name="answer" id="c" class="answer" >
                    <label for="c" id="c_text">Answer</label>
                </li>
                <li>
                    <input type="radio" name="answer" id="d" class="answer" >
                    <label for="d" id="d_text">Answer</label>
                </li>
            </ul>
        </div>

    <button type="button" class="btn btn-warning" id="submit">Submit</button>
    
    </div>
 </div>
    
</body>
</html>

answer.js:

class Answer {
    constructor(a,b,c,d){
        this.a = a;
        this.b = b;
        this.c = c;
        this.d = d;
    }
}

app.js:

const quizData = [
    new Question(
      'Which one is not an object oriented programming langauge?',
      'C',
      new Answer('Java', 'C#', 'C++', 'C')
    ),
    new Question(
      'Which language is used for styling web pages?',
      'CSS',
      new Answer('HTML', 'JQuery', 'CSS', 'XML')
    ),
    new Question(
      'There are ___ main components of object oriented programming.?',
      '4',
      new Answer('1', '6', '2', '4')
    ),
    new Question(
      'Which langauge is used for web apps?',
      'All',
      new Answer('PHP', 'Python', 'JavaScript', 'All')
    ),
  ];

const quiz = document.querySelector('#quiz');
const answerEls = document.querySelectorAll('.answer');
const questionEl = document.querySelector('#question');
const a_text = document.querySelector('#a_text');
const b_text = document.querySelector('#b_text');
const c_text = document.querySelector('#c_text');
const d_text = document.querySelector('#d_text');
const submitBtn = document.querySelector('#submit');

let currentQuiz = 0
let score = 0;



const loadQuiz =()=>{
    deselectAnswers();

    let currentQuizData = quizData[currentQuiz];
    let answers = currentQuizData.answers;
  
    questionEl.innerText = currentQuizData.question;
    a_text.innerText = answers.a;
    b_text.innerText = answers.b;
    c_text.innerText = answers.c;
    d_text.innerText = answers.d;

};

const deselectAnswers=()=>{
    answerEls.forEach(answerEl=>answerEl.checked = false)
};

loadQuiz();

const getSelected=()=> {
    let answer
    answerEls.forEach(answerEl => {
        if(answerEl.checked) {
            answer = answerEl.id
        }
    })
    return answer
}
submitBtn.addEventListener('click', () => {
    const answer = getSelected();
    if(answer) {
      if(answer === quizData[currentQuiz].correctAnswer) {
        score++;
      }
      currentQuiz++;
      if(currentQuiz < quizData.length) {
        loadQuiz();
      } else {
        quiz.innerHTML = `
        <h2>You answered ${score}/${quizData.length} questions correctly</h2>
        <button onclick="location.reload()">Reload</button>
        `;
      }
    }
  });

question.js:

class Question {
    constructor(question, correctAnswer, answers) {
        this.question = question;
        this.correctAnswer = correctAnswer;
        this.answers = answers;
    }
    static saveQuizes() {
        localStorage.clear();
        localStorage.setItem("Quizes", JSON.stringify(quizes));
    }

    static loadQuizes() {
        let quizes = JSON.parse(localStorage.getItem("Quizes"));
        return quizes;
    }
}
4

Zobacz, co ci wypluwa konsola błędów.
Sprawdź ścieżki skryptów, czy są poprawne.
Sprawdź, czy kolejność osadzanych skryptów jest poprawna.

3

Wrzuciłem na codepen i pytania się wyświetlają. Prawdopodobnie coś źle importujesz. Tak, jak napisał @LukeJL - sprawdź co mówi konsola (PPM -> zbadaj -> Konsola). Szukaj komunikatów na czerwonym tle.

0

Skärmbild 2022-12-27 102637.png
Taki oto błąd wyskakuje ale ja tam nie widzę żadnego błędu

2

Przemyśl to. Przeczytaj dokładnie.
Plik app.js uważa, że klasa Answer nie jest zdefiniowana.

Mając to na uwadze cofnij się i przeczytaj mój poprzedni post.

0

A w jaki sposób mogę ja zdefiniować ? Przepraszam za głupie pytanie ale dopiero się uczę.

3

Spróbuj w sekcji head zamienić kolejność ładowania skryptów.

<head>
  <!-- ... -->
  
  <script src="./classes/questions.js" defer></script>
  <script src="./classes/answer.js" defer></script>
  <script src="./classes/app.js" defer></script>
  
  <!-- ... -->
</head>
0

Zmieniłem kolejność skryptów i zadziałało ! Dziękuję bardzo ! Faktycznie zapomniałem o dodaniu window.onload które może również mogło być problemem. Teraz kolejne pytanie jak sprawdzić czy wszystko zapisuje się w local storage i ewentualnie jak to zrobić ?

2
AtomBari22 napisał(a):

Teraz kolejne pytanie jak sprawdzić czy wszystko zapisuje się w local storage i ewentualnie jak to zrobić ?

W tym samym miejscu co błąd (devtoolsy), tylko musisz się przełączyć do innej zakładki.

Przykładowo tak wygląda zawartość local storage na 4programmers

screenshot-20221227105442.png

0

Ok czyli to nie działa.. eh z jednego problemu do drugiego :D

class Question {
    #getQuizes = [];
   
    constructor(question, correctAnswer, answers) {
      this.question = question;
      this.correctAnswer = correctAnswer;
      this.answers = answers;
    }
    static saveQuizes() {
      let quizes = this.#getQuizes();
      localStorage.clear();
      localStorage.setItem("Quizes", JSON.stringify(quizes));
    }
   
    static loadQuizes() {
      let quizes = JSON.parse(localStorage.getItem("Quizes"));
      return quizes;
    }
  }

Czyli to jest źle ?

0

No na pewno nie możesz zakładać, że w localstorage będzie konkretny wpis Quizes. Jeśli go nie będzie to getItem zwróci null. Czyli loadQuizzes może zwrócić null.

Poza tym tak jak zadeklarowałeś to #getQuizes to tablica, a nie metoda, więc czemu robisz:

 this.#getQuizes();

?

1
 localStorage.setItem('quizData', JSON.stringify(quizData));
 
  let retrievedQuizData = JSON.parse(localStorage.getItem('quizData'));

udało mi się rozwiązać ten problem,

0

Zmieniłem mój kod i teraz problem jest taki iż nawet jeśli odpowiadam dobrze to wynik końcowy jest 0. Jak to rozwiązać ?
index.html

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
 
    
    <link href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-GLhlTQ8iRABdZLl6O3oVMWSktQOp6b7In1Zl3/Jr59b6EGGoI1aFkw7cmDA6j6gD" crossorigin="anonymous">
 

    <script src="./classes/questions.js" defer></script>
    <script src="./classes/answer.js" defer></script>
    <script src="./classes/app.js" defer></script>  

    <script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/js/bootstrap.bundle.min.js" integrity="sha384-w76AqPfDkMBDXo30jS1Sgez6pr3x5MlQ1ZAGC+nuZB+EYdgRZgiwxhTBTkF7CXvN" crossorigin="anonymous" defer></script>
 
    <link rel="stylesheet" href="./styles/style.css">

  </head>
  <body class="bg-dark">
 
    
    <div class="container text-center bg-dark text-warning">
      <div class="quiz-container mx-auto" id="quiz">
        <div class="quiz-header">
            
            <div class="quiz-select">
                <h3>Select Quiz:</h3>
                <button type="button" class="btn btn-warning" id="quiz1-btn">Quiz 1</button>
                <button type="button" class="btn btn-warning" id="quiz2-btn">Quiz 2</button>
              </div>
            </div>

          <h2 id="question">Question Text</h2>
          <ul>
            <li>
              <input type="radio" name="answer" id="a" class="answer" >
              <label for="a" id="a_text">Answer</label>
            </li>
            <li>
              <input type="radio" name="answer" id="b" class="answer" >
              <label for="b" id="b_text">Answer</label>
            </li>
            <li>
              <input type="radio" name="answer" id="c" class="answer" >
              <label for="c" id="c_text">Answer</label>
            </li>
            <li>
              <input type="radio" name="answer" id="d" class="answer" >
              <label for="d" id="d_text">Answer</label>
            </li>
          </ul>

          <button type="button" class="btn btn-warning" id="submit">Submit</button>
        
        </div>
      </div>
    </div>
 
  </body>
</html>

window.onload =()=>{

  const quizData1 = [
    
    new Question(
      'Which one is not an object oriented programming langauge?',
      'C',
      new Answer('Java', 'C#', 'C++', 'C')
    ),
    new Question(
      'Which language is used for styling web pages?',
      'CSS',
      new Answer('HTML', 'JQuery', 'CSS', 'XML')
    ),
  
  ];
   
  const quizData2 = [

    new Question(
      'There are ___ main components of object oriented programming.?',
      '4',
      new Answer('1', '6', '2', '4')
    ),
    new Question(
      'Which langauge is used for web apps?',
      'All',
      new Answer('PHP', 'Python', 'JavaScript', 'All')
    ),
  ];

  localStorage.setItem('allQuizData', JSON.stringify({ quizData1, quizData2 }));

  // Retrieve quiz data from local storage
  const retrievedQuizData = JSON.parse(localStorage.getItem('allQuizData'));

   
  const quiz = document.querySelector('#quiz');
  const answerEls = document.querySelectorAll('.answer');
  const questionEl = document.querySelector('#question');
  const a_text = document.querySelector('#a_text');
  const b_text = document.querySelector('#b_text');
  const c_text = document.querySelector('#c_text');
  const d_text = document.querySelector('#d_text');
  const submitBtn = document.querySelector('#submit');
  const quiz1Btn = document.querySelector('#quiz1-btn');
  const quiz2Btn = document.querySelector('#quiz2-btn');
   
  let currentQuiz = 0
  let score = 0;

  let currentQuizData = quizData1;

  const loadQuiz =()=>{
    deselectAnswers();

    
  if (quiz1Btn.classList.contains('active')) {
    currentQuizData = retrievedQuizData.quizData1;
  } else if (quiz2Btn.classList.contains('active')) {
    currentQuizData = retrievedQuizData.quizData2;
  }

   
    let currentQuestionData = currentQuizData[currentQuiz];
    let answers = currentQuestionData.answers;

    questionEl.innerText = currentQuestionData.question;
    a_text.innerText = answers.a;
    b_text.innerText = answers.b;
    c_text.innerText = answers.c;
    d_text.innerText = answers.d;
   
  };
   
  const deselectAnswers=()=>{
    answerEls.forEach(answerEl=>answerEl.checked = false)
  };
   
  loadQuiz();
   
 
  const getSelected=()=> {
    let answer;
    answerEls.forEach(answerEl => {
      if(answerEl.checked) {
        answer = answerEl.id;
      }
    });
    return answer;
  };

 submitBtn.addEventListener('click', () => {
  const answer = getSelected();
  if(answer) {
    if(answer === currentQuizData[currentQuiz].correctAnswer) {
      score++;
    }
    currentQuiz++;
    if(currentQuiz < currentQuizData.length) {
      loadQuiz();
    } else {
      let quizLength = quizData1.length;
      if (quiz2Btn.classList.contains('active')) {
        quizLength = quizData2.length;
      }
      quiz.innerHTML = `
      <h2>You answered ${score}/${quizLength} questions correctly</h2>
      <button onclick="location.reload()" class="btn btn-warning">Reload</button>
      `;
    }
  }
});


  quiz1Btn.addEventListener('click', () => {
    currentQuizData = quizData1;
    currentQuiz = 0;
    score = 0;
    loadQuiz();
    quiz1Btn.classList.add('active');
    quiz2Btn.classList.remove('active');
  });

  quiz2Btn.addEventListener('click', () => {
    currentQuizData = quizData2;
    currentQuiz = 0;
    score = 0;
    loadQuiz();
    quiz2Btn.classList.add('active');
    quiz1Btn.classList.remove('active');
  });
 

};
0

Rozwiązane ! Problem leżał w tym ze kod pobierał id z checkboxa.

new Question(
      'Which one is not an object oriented programming langauge?',
      **'d'**,
      new Answer('Java', 'C#', 'C++', 'C')
    ),
    new Question(
      'Which language is used for styling web pages?',
      **'c'**,
      new Answer('HTML', 'JQuery', 'CSS', 'XML')
    ),

1 użytkowników online, w tym zalogowanych: 0, gości: 1