html无法实现随机抽题,必须依赖javascript;推荐用fisher-yates算法均匀打乱题库数组,并校验抽取数量避免越界,再通过createelement安全渲染题目。

HTML 本身不能随机抽题或管理题库——它只是静态标记语言,不处理逻辑。真正实现“随机抽题”必须靠 JavaScript;题库数据可以写在 HTML 里(如 <script></script> 中的数组),也可以从外部 JSON 加载,但所有随机性、计数、题目筛选都得由 JS 控制。
用 JavaScript 的 Math.random() 和 sort() 实现简单随机打乱
这是最常见也最容易出错的方式:很多人直接用 array.sort(() => Math.random() - 0.5),但它**不是均匀随机**,会导致某些题目被抽中概率偏高。现代推荐用 Fisher-Yates 洗牌算法(原地打乱)。
- 先定义题库为数组,每个元素是一个题目对象:
const quizBank = [ { id: 1, question: "HTML 中 <div> 是什么类型元素?", options: ["行内", "块级", "空元素"], answer: 1 }, { id: 2, question: "CSS 中设置文字颜色用哪个属性?", options: ["font-color", "text-color", "color"], answer: 2 } ];<li>用 Fisher-Yates 打乱:<pre class="brush:php;toolbar:false;">function shuffle(arr) { const copy = [...arr]; for (let i = copy.length - 1; i > 0; i--) { const j = Math.floor(Math.random() * (i + 1)); [copy[i], copy[j]] = [copy[j], copy[i]]; } return copy; } - 抽前 N 题:
const selected = shuffle(quizBank).slice(0, 5); - 抽题前必须校验:
const count = Math.min(desiredCount, quizBank.length); - 最好给用户明确反馈:
if (count - 若业务要求“必须凑够 N 题”,需额外实现重复抽题(带去重)或允许题目复用——但要避免同一题连续出现,得加限制逻辑
- 安全渲染单题:
function renderQuestion(el, q) { el.innerHTML = ''; const h3 = document.createElement('h3'); h3.textContent = q.question; el.appendChild(h3); <p>q.options.forEach((opt, i) => { const label = document.createElement('label'); label.innerHTML = <code><input type="radio" name="q${q.id}" value="${i}"> ${opt}</code>; el.appendChild(label); }); }</p> - 调用:
renderQuestion(document.getElementById('question-area'), selected[0]); - 注意:
q.options若含用户可控内容(如从 JSON 文件读取),必须用textContent而非innerHTML渲染选项文本,防止脚本注入
抽题数量超过题库总数时的容错处理
如果用户配置抽 10 题,但题库只有 7 道,slice(0, 10) 不会报错,但结果只有 7 道——这容易导致测验页空白或逻辑断裂(比如显示“第 8 题”,却无内容)。
将调研报告、方案对比、数据分析、需求梳理、会议纪要、设计说明、代码评审、学习笔记等任务产物输出为可在浏览器直接打开的单文件 HTML,替代 Markdown 作为最终交付物。Markdown 在信息密度、视觉清晰度和可分享性上已跟不上 AI 产物的丰富度,HTML 能同时承载排版、表格、SVG 等。
把题目渲染到 HTML 页面的最小可行方式
不要用 document.write(已过时且会清空整个页面),也不建议拼接大段 HTML 字符串后 innerHTML 注入(XSS 风险)。推荐用 document.createElement 或模板字符串 + textContent 安全插入。
真正的难点不在“怎么随机”,而在于题干/选项/答案结构是否一致、有没有图片或公式等富内容、是否要记录用户作答状态、是否支持分页或限时——这些都会让“抽题”逻辑迅速脱离纯前端能干净解决的范围。别低估数据结构设计对后续扩展的影响。










