将JSON转为HTML单选测验时遇fetch与遍历问题求助
问题分析与修复方案
导致错误的核心问题
- Fetch 链未返回解析后的 JSON:第一个
then回调里调用了response.json()但没有返回结果,导致后续then接收到的参数是undefined,直接引发读取length时的类型错误。 - JSON 结构是对象而非数组:你的 JSON 数据中,
quiz是包含多个问题对象的键值对集合,不是数组,因此无法通过length属性获取长度。 - 循环条件笔误:
1 < quiz.length应为i < quiz.length(原条件会导致无限循环)。 - HTML 标签拼写错误:
imput应为input。 - 选项渲染方式错误:直接拼接数组会生成逗号分隔的字符串,需要遍历每个选项生成独立的单选按钮。
修正后的代码
<script> fetch("quiz.json") .then(function(response) { return response.json(); // 必须返回解析后的JSON }) .then(function(data) { // 将问题对象转换为数组以便遍历 const questions = Object.values(data.quiz); questions.forEach(function(questionObj) { // 插入问题标题 document.body.innerHTML += `<h2>${questionObj.question}</h2>`; // 遍历选项生成单选按钮组 questionObj.options.forEach(function(option) { document.body.innerHTML += ` <div> <input type="radio" name="quiz-group-${questionObj.question}" value="${option}"> <label>${option}</label> </div> `; }); // 插入正确答案 document.body.innerHTML += `<p>正确答案: ${questionObj.answer}</p>`; }); }) .catch(function(error) { console.error("加载或解析JSON失败:", error); }); </script>
额外注意事项
- JSON 文件格式验证:确保
quiz.json使用普通双引号("),而非 HTML 实体",否则 JSON 解析会失败。正确的 JSON 结构示例:
{ "quiz": { "q1": { "question": "Which one is correct team name in NBA?", "options": [ "New York Bulls", "Los Angeles Kings", "Golden State Warriros", "Huston Rocket" ], "answer": "Huston Rocket" }, "q2": { "question": "'Namaste' is a traditional greeting in which Asian language?", "options": [ "Hindi", "Mandarin", "Nepalese", "Thai" ], "answer": "Hindi" } } }
- 单选按钮分组:给每个问题的单选按钮设置相同的
name属性,确保同一问题只能选择一个选项。 - 错误处理:添加
catch块捕获请求或解析过程中的错误,便于调试。
内容的提问来源于stack exchange,提问作者Lazar Mladenovic
相关产品推荐
相关产品推荐

