You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JavaScript/HTML测验重构双页后题目无法显示的问题求助

JavaScript/HTML测验重构双页后题目无法显示的问题求助

问题背景

我正在为大学项目开发一个基于JavaScript和HTML的测验应用。之前的版本是单页结构(设置了200%宽度),通过current类和透明度属性来切换显示/隐藏测验内容,但因为完全不响应式,我把它重构为index和quiz两个独立页面。目前还没开始做媒体查询,先想让核心功能跑起来,但现在测验题目完全不显示,而且控制台没有任何报错信息,实在找不到问题出在哪。

我的代码细节

核心JavaScript逻辑

const continueBtn = document.querySelector('.continue-btn');
const quizSection = document.querySelector('.quiz-section');
const quizBox = document.querySelector('.quiz-box');
const resultBox = document.querySelector('.result-box');
const tryAgainBtn = document.querySelector('.try-again-btn');
const homeBtn = document.querySelector('.home-button');

// 重新开始测验的点击事件(重置计数器和显示状态)
tryAgainBtn.onclick = () => {
  quizBox.classList.add('current');
  nextBtn.classList.remove('current');
  resultBox.classList.remove('current');
  questionCount = 0;
  questionNumb = 1;
  userScore = 0;
  showQuestions(questionCount);
  quizCounter(questionNumb);
  headerScore();
};

// 返回首页的点击事件
homeBtn.onclick = () => {
  quizSection.classList.remove('current');
  nextBtn.classList.remove('current');
  resultBox.classList.remove('current');
  questionCount = 0;
  questionNumb = 1;
  userScore = 0;
  showQuestions(questionCount);
  quizCounter(questionNumb);
};

// 初始化计数器
let questionCount = 0;
let questionNumb = 1;
let userScore = 0;

const quizQuestions = document.querySelector('.quiz-questions');

// 渲染题目和选项的函数
function showQuestions(i) {
  const questionText = document.querySelector('.question-title');
  questionText.textContent = `${questions[i].numb}. ${questions[i].question}`;
  
  let quizTag = `<div class="question"><span>${questions[i].options[0]}</span></div>
<div class="question"><span>${questions[i].options[1]}</span></div>
<div class="question"><span>${questions[i].options[2]}</span></div>
<div class="question"><span>${questions[i].options[3]}</span></div>`;
  
  quizQuestions.innerHTML = quizTag;
  
  const question = document.querySelectorAll('.question');
  for (let i = 0; i < question.length; i++) {
    question[i].setAttribute('onclick', 'questionSelected(this)');
  }
}

// 选项选择后的逻辑(判断对错+禁用选项)
function questionSelected(answer) {
  let userAnswer = answer.textContent;
  let correctAnswer = questions[questionCount].answer;
  let allQuestions = quizQuestions.children.length;

  if (userAnswer === correctAnswer) {
    answer.classList.add('correct');
    userScore += 1;
    headerScore();
  } else {
    answer.classList.add('incorrect');
    // 自动标记正确答案
    for (let i = 0; i < allQuestions; i++) {
      if (quizQuestions.children[i].textContent == correctAnswer) {
        quizQuestions.children[i].setAttribute('class', 'question correct');
      }
    }
  }

  // 禁用所有选项,防止重复选择
  for (let i = 0; i < allQuestions; i++) {
    quizQuestions.children[i].classList.add('disabled');
  }

  nextBtn.classList.add('current');
}

const nextBtn = document.querySelector('.next-btn');

// 下一题按钮的点击逻辑
nextBtn.onclick = () => {
  if (questionCount < questions.length - 1) {
    questionCount++;
    showQuestions(questionCount);
    questionNumb++;
    quizCounter(questionNumb);
    nextBtn.classList.remove('current');
  } else {
    showResultBox();
  }
};

// 渲染题目计数器(如"1 of 5 Questions")
function quizCounter(i) {
  const quizTotal = document.querySelector('.quiz-total');
  quizTotal.textContent = `${i} of ${questions.length} Questions`;
}

// 更新头部的分数显示
function headerScore() {
  const headerScoreText = document.querySelector('.header-score');
  headerScoreText.textContent = `Score ${userScore} / ${questions.length}`;
}

// 显示结果页面
function showResultBox() {
  quizBox.classList.remove('current');
  resultBox.classList.add('current');
  const scoreText = document.querySelector('.score-text');
  scoreText.textContent = `You Scored ${userScore} Out Of ${questions.length}`;
}

HTML结构(quiz页面)

<!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">
  <link rel="stylesheet" href="assets/css/style.css" type="text/css">
  <title>InPhysical Quiz</title>
</head>
<body>
  <section class="quiz-section">
    <!-- 测验题目容器 -->
    <div class="quiz-box">
      <h2>InPhysical Quiz!</h2>
      <div class="quiz-header">
        <span>Fitness and Exercise Quiz</span>
        <span class="header-score">Score 0 / 5</span>
      </div>
      <h2 class="question-title">When squatting which muscle is not used?</h2>
      <div class="quiz-questions"></div>
      <div class="quiz-footer">
        <span class="quiz-total">1 of 5 Questions</span>
        <button class="next-btn">Next</button>
      </div>
    </div>
    <!-- 测验结果容器 -->
    <div class="result-box">
      <h2>Quiz Results!</h2>
      <div class="results-container">
        <span class="score-text">You Scored 0 Out Of 5</span>
      </div>
      <div class="buttons">
        <button class="try-again-btn">Try Again!</button>
        <button class="home-button">Home</button>
      </div>
    </div>
  </section>
</body>
<script defer src="assets/js/questions.js"></script>
<script defer src="assets/js/script.js"></script>
</html>

题目数组示例(assets/js/questions.js)

let questions = [{
  numb: 1,
  question: 'When squatting which muscle is not used?',
  answer: 'D. Biceps',
  options: [
    'A. Glutes',
    'B. Quads',
    'C. Hamstrings',
    'D. Biceps',
  ]
},
{
  numb: 2,
  question: 'Which exercise targets the lats when working out?',
  answer: 'D. Cable Pull Down',
  options: [
    'A. Hyperextensions',
    'B. Overhead Press',
    'C. Box Squats',
    'D. Cable Pull Down',
  ]
}]

补充说明

之前的单页版本是通过200%宽度+current类+过渡动画来切换显示信息页和测验页,点击按钮后信息页隐藏,测验页滑入显示,完成5题后展示分数,还能重新开始。现在重构为双页后,核心逻辑是复用之前的JS,但题目完全不显示。

我的疑问

目前控制台没有任何报错,我实在找不到问题点。请问我是应该直接重写整个测验逻辑,还是有什么细节我漏掉了可以修复?


备注:内容来源于stack exchange,提问作者DJCave

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.20 13:03:04