Frontend Quiz app with HTML, CSS, JavaScript

Solution retrospective
✅ Proud of:
- 🎉 Successfully modularizing the JavaScript code into separate files (
data.js
,navigation.js
,quiz.js
, andmain.js
), making it more maintainable and readable. - ♻️ Keeping code clean and structured, following best practices like DRY (Don’t Repeat Yourself) and writing small, reusable functions.
- 🎮 Implementing keyboard navigation and dark mode toggle, improving accessibility and user experience.
- 💾 Storing quiz progress and scores using localStorage, so users can see their results even after refreshing the page.
🔄 What would I do differently next time?:
- 🏗️ Consider using a state management approach (like an object to hold
quizData
,currentQuiz
,currentQuestionIndex
, anduserScore
) instead of separate variables. - ⚠️ Improve error handling to display user-friendly messages when quiz data fails to load.
- 🧪 Write unit tests for key functions like
loadCurrentQuestion()
andsubmitAnswer()
to catch issues early.
❓ Managing state across modules: Initially, currentQuiz
was undefined in some modules.
- ✅ Solution: Ensured variables like
quizData
andcurrentQuiz
were properly initialized and updated at the right time, avoiding unnecessary global state.
🔁 Event listener duplication: In loadCurrentQuestion()
, answer buttons retained old event listeners, causing unexpected behavior.
- ✅ Solution: Used
button.cloneNode(true)
to remove old event listeners before adding new ones.
🎮 Handling keyboard navigation: Managing focus and selection dynamically across different pages was tricky.
- ✅ Solution: Implemented separate functions for handling navigation on different pages, ensuring smooth transitions between UI elements.
⚡ State Management: Are there better ways to manage and update quizData
, currentQuiz
, and userScore
without using global variables?
🚨 Error Handling: How can I improve error handling for cases where the quiz data fails to load or the user navigates incorrectly?
🚀 Performance: Are there any areas where I could optimize my DOM manipulation for better performance?
🧑💻 Unit Testing: What are the best strategies to write tests for key functions like loadCurrentQuestion()
and submitAnswer()
?
Please log in to post a comment
Log in with GitHubCommunity feedback
- P@gkilasonia
Overall structured approach,
Addressing --Error Handling: How can I improve error handling for cases where the quiz data fails to load or the user navigates incorrectly?--
If data fails to load you can add --if (!response.ok) { throw new Error(
HTTP error! status: ${response. Status}
); }--document.addEventListener("DOMContentLoaded", async () => { try { const response = await fetch("./data.json"); --if (!response.ok) { throw new Error(
HTTP error! status: ${response. Status}
); }-- myDatabaseData = await response.json(); } catch (error) { console.error("Error fetching data:", error); } });For this quiz scenario, the user's incorrect navigation is unlikely; otherwise, logic would be derived from the possibility of erroneous navigation.
Marked as helpful
Join our Discord community
Join thousands of Frontend Mentor community members taking the challenges, sharing resources, helping each other, and chatting about all things front-end!
Join our Discord