调用showDataset时报Cannot read properties of undefined (reading 'Messages')错误如何解决
问题原因&修复方案
1. 页面加载逻辑顺序错误
你的<body>标签绑定了onload="showDataset()",页面加载完成就直接执行这个函数,但此时你从来没有调用过loadJSON()发起JSON请求,全局变量Quotes还是初始的undefined状态,自然读取Quotes.Messages就会抛出你遇到的类型错误。
修复:把body的onload事件改成调用loadJSON(),请求成功后HandleData里已经会调用showDataset()了,不需要onload直接调。
<!-- 修改前 --> <body id="page" onload="showDataset()"> <!-- 修改后 --> <body id="page" onload="loadJSON()">
2. Quotes.json格式不符合标准JSON规范
你提供的JSON存在多处语法错误:
- 整个JSON对象外层缺少大括号包裹
- 键名
Messages没有加双引号(JSON要求所有字符串键必须用双引号) - 数组第二个元素末尾缺少逗号分隔
修复后的正确JSON内容:
{ "Messages": [ {"Time": "1", "Note": "2", "Username": "3"}, {"Time": "11", "Note": "21", "Username": "31"}, {"Time": "12", "Note": "22", "Username": "32"} ] }
3. 代码字段对应错误
你JSON里存储时间的键是Time,但showDataset函数里读的是Quotes.Messages[x].datetime,字段名不匹配会读不到值。同时你已经用createElement创建了p元素,不需要再在innerHTML里套冗余的<p>标签。
修复:
// 修改前 p.innerHTML = "<p>"+ Quotes.Messages[x].datetime + " : "+ Quotes.Messages[x].Note + " By : " + Quotes.Messages[x].Username + "</p>"; // 修改后 p.innerHTML = Quotes.Messages[x].Time + " : "+ Quotes.Messages[x].Note + " By : " + Quotes.Messages[x].Username;
4. 不建议用eval解析JSON
eval会执行传入的任意代码,有安全风险,替换成标准的JSON.parse即可:
// 修改前 Quotes = eval('(' + xmlhttp.responseText + ')'); // 修改后 Quotes = JSON.parse(xmlhttp.responseText);
内容的提问来源于stack exchange,提问作者Jae_JPN
相关产品推荐
相关产品推荐

