You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

纯原生JavaScript(Vanilla JavaScript)迷你测验应用开发技术咨询

纯原生JavaScript(Vanilla JavaScript)迷你测验应用开发技术咨询

嘿,我来手把手教你搭一个纯原生JS的迷你测验应用,完全不需要任何框架,功能全满足:显示题目+选项、判断对错算分、下一题切换,最后出总分。咱们一步步来,保证你能看懂~


第一步:先搭HTML结构

首先咱们把页面的基本架子写好,需要放题目、选项、分数显示和下一题按钮的地方,结构超简单:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>迷你JS测验</title>
    <link rel="stylesheet" href="style.css">
</head>
<body>
    <div class="quiz-container">
        <h1>迷你知识测验</h1>
        <!-- 分数显示 -->
        <div class="score">当前得分: <span id="score">0</span></div>
        <!-- 题目区域 -->
        <div class="question" id="question"></div>
        <!-- 选项容器 -->
        <div class="options-container" id="options-container"></div>
        <!-- 下一题按钮 -->
        <button id="next-btn">下一题</button>
    </div>

    <script src="app.js"></script>
</body>
</html>

每个部分的作用一目了然:quiz-container包起所有元素让布局更规整;score实时展示当前得分;question放当前题目;options-container动态生成选项按钮;next-btn负责切换题目。


第二步:加一点基础CSS美化

咱们给它整个舒服点的样式,不用太复杂,重点是让选项看起来像可点击的按钮,交互状态清晰:

* {
    box-sizing: border-box;
    margin: 0;
    padding: 0;
    font-family: Arial, sans-serif;
}

.quiz-container {
    max-width: 800px;
    margin: 2rem auto;
    padding: 2rem;
    background-color: #f5f5f5;
    border-radius: 10px;
    box-shadow: 0 2px 10px rgba(0,0,0,0.1);
}

.score {
    font-size: 1.2rem;
    font-weight: bold;
    margin-bottom: 1.5rem;
    color: #2c3e50;
}

.question {
    font-size: 1.5rem;
    margin-bottom: 1.5rem;
    color: #34495e;
}

.options-container {
    display: flex;
    flex-direction: column;
    gap: 1rem;
    margin-bottom: 2rem;
}

.option-btn {
    padding: 1rem;
    border: none;
    border-radius: 5px;
    background-color: #3498db;
    color: white;
    font-size: 1rem;
    cursor: pointer;
    transition: background-color 0.2s;
}

.option-btn:hover {
    background-color: #2980b9;
}

.option-btn.correct {
    background-color: #2ecc71;
}

.option-btn.incorrect {
    background-color: #e74c3c;
}

.option-btn:disabled {
    cursor: not-allowed;
    opacity: 0.8;
}

#next-btn {
    padding: 1rem 2rem;
    border: none;
    border-radius: 5px;
    background-color: #9b59b6;
    color: white;
    font-size: 1rem;
    cursor: pointer;
    transition: background-color 0.2s;
}

#next-btn:hover {
    background-color: #8e44ad;
}

#next-btn:disabled {
    cursor: not-allowed;
    opacity: 0.6;
}

重点提几个关键样式:

  • correct/incorrect类会在JS里用来标记对错选项的颜色
  • 禁用状态的按钮变灰,防止重复点击
  • 容器加了阴影和圆角,避免页面太生硬

第三步:核心JS逻辑实现

这部分是灵魂,咱们分模块写,逻辑清晰,你可以直接复制,也可以自己改题目数据。

app.js里写代码,咱们一步步解释:

1. 定义测验的题目数据

你可以随便改这些题目,格式就是数组里放对象,每个对象包含题目、选项数组、正确答案:

// 定义题目数据,你可以根据需求随便修改/添加
const quizQuestions = [
    {
        question: "JavaScript中,以下哪个是原始数据类型?",
        options: ["Object", "Array", "String", "Function"],
        correct: "String"
    },
    {
        question: "以下哪个方法可以向数组末尾添加元素?",
        options: ["shift()", "unshift()", "push()", "pop()"],
        correct: "push()"
    },
    {
        question: "在HTML中,哪个标签用来引入外部JavaScript文件?",
        options: ["<script>", "<link>", "<style>", "<meta>"],
        correct: "<script>"
    },
    {
        question: "以下哪个操作符用于严格相等比较?",
        options: ["==", "===", "!=", "!=="],
        correct: "==="
    }
];

2. 获取DOM元素并初始化变量

先把页面上的元素拿到,再定义当前题目索引、当前分数,还有标记是否已答题的变量:

// 获取DOM元素
const questionElement = document.getElementById('question');
const optionsContainer = document.getElementById('options-container');
const scoreElement = document.getElementById('score');
const nextBtn = document.getElementById('next-btn');

// 初始化核心变量
let currentQuestionIndex = 0;
let score = 0;
let answered = false; // 标记当前题目是否已经作答,防止重复点击

3. 渲染题目的函数

这个函数负责把当前题目和选项渲染到页面上,每次切换题目都要调用它:

// 渲染当前题目和选项
function renderQuestion() {
    // 重置答题状态
    answered = false;
    nextBtn.disabled = true;
    optionsContainer.innerHTML = ''; // 清空之前的选项

    // 获取当前题目数据
    const currentQuestion = quizQuestions[currentQuestionIndex];

    // 渲染题目文本
    questionElement.textContent = currentQuestion.question;

    // 循环生成选项按钮
    currentQuestion.options.forEach(option => {
        const optionBtn = document.createElement('button');
        optionBtn.classList.add('option-btn');
        optionBtn.textContent = option;
        
        // 给每个选项绑定点击事件
        optionBtn.addEventListener('click', () => handleOptionClick(optionBtn, option));
        
        optionsContainer.appendChild(optionBtn);
    });

    // 更新分数显示
    scoreElement.textContent = score;
}

4. 处理选项点击的函数

点击选项后,判断对错、更新分数、标记选项样式,并且启用下一题按钮:

// 处理选项点击事件
function handleOptionClick(optionBtn, selectedOption) {
    if (answered) return; // 如果已经答过题,直接返回,防止重复点击
    answered = true;
    nextBtn.disabled = false;

    const currentQuestion = quizQuestions[currentQuestionIndex];

    // 判断选项是否正确
    if (selectedOption === currentQuestion.correct) {
        score++;
        optionBtn.classList.add('correct');
    } else {
        optionBtn.classList.add('incorrect');
        // 顺便把正确选项标出来,让用户知道错在哪
        const correctOptionBtn = Array.from(optionsContainer.children).find(btn => btn.textContent === currentQuestion.correct);
        if (correctOptionBtn) correctOptionBtn.classList.add('correct');
    }

    // 禁用所有选项,避免误操作
    Array.from(optionsContainer.children).forEach(btn => btn.disabled = true);

    // 更新分数显示
    scoreElement.textContent = score;
}

这里做了几个细节优化:

  • answered变量防止重复点击同一题的选项
  • 答错时自动标记正确选项,提升用户体验
  • 点击后禁用所有选项,避免多次操作

5. 处理下一题按钮的点击

切换到下一题,或者最后一题显示最终结果:

// 处理下一题按钮点击
function handleNextClick() {
    currentQuestionIndex++;

    // 判断是否还有题目
    if (currentQuestionIndex < quizQuestions.length) {
        renderQuestion();
        // 如果是最后一题,把按钮文本改成"查看结果"
        if (currentQuestionIndex === quizQuestions.length - 1) {
            nextBtn.textContent = "查看结果";
        }
    } else {
        // 显示最终测验结果
        showFinalResult();
    }
}

// 显示最终结果
function showFinalResult() {
    questionElement.textContent = `测验结束!你的总分是 ${score}/${quizQuestions.length}`;
    optionsContainer.innerHTML = '';
    nextBtn.style.display = 'none'; // 隐藏下一题按钮

    // 可选:添加重新开始按钮
    const restartBtn = document.createElement('button');
    restartBtn.textContent = "重新开始";
    restartBtn.classList.add('option-btn');
    restartBtn.addEventListener('click', () => restartQuiz());
    optionsContainer.appendChild(restartBtn);
}

// 重新开始测验(可选功能)
function restartQuiz() {
    currentQuestionIndex = 0;
    score = 0;
    nextBtn.textContent = "下一题";
    nextBtn.style.display = 'block';
    renderQuestion();
}

6. 初始化测验

最后,页面加载完成后调用渲染函数,并且给下一题按钮绑定事件:

// 页面加载完成后初始化测验
document.addEventListener('DOMContentLoaded', () => {
    renderQuestion();
    nextBtn.addEventListener('click', handleNextClick);
});

最后:运行测试

把这三个文件(HTML、CSS、JS)放在同一个文件夹里,打开HTML文件就能用了!你可以随便修改题目数据,加更多题目,或者调整样式,完全自定义。

注意事项

  • 题目数据里的correct值必须和options里的某一个完全一致,不然会判断错误
  • 如果要加更多功能(比如计时、题目分类),都可以在这个基础上扩展
  • 纯原生JS写的,所有现代浏览器都支持,不需要任何依赖

怎么样,是不是超简单?有问题随时问我~ 😊

火山引擎 最新活动