D3.js读取JSON文件部分浏览器出现TypeError问题求助
首先明确说:JSON本身没有嵌套层级限制,所以你遇到的问题肯定不是这个原因导致的。结合跨浏览器的差异来看,大概率是下面几个常见问题:
异步加载的时序问题
D3.js加载JSON是异步操作,代码不会等待JSON加载完成再往下执行。在Safari和macOS Firefox里可能因为加载速度快或者缓存命中,刚好在你执行console.log的时候数据已经加载完毕;但Chrome和Windows Firefox可能还没完成加载,这时候postcards或者postcards.nodes还是undefined,自然会抛出类型错误。解决方法很简单:把所有依赖JSON数据的代码都放在D3加载JSON的回调函数里。比如用D3 v6+的写法:
d3.json("你的JSON文件路径") .then(function(postcards) { // 所有需要用到postcards的代码都放在这里 console.log("event -> "+ postcards.nodes[0].node.event); // 其他D3绘图逻辑... }) .catch(function(err) { console.error("JSON加载失败:", err); });如果是旧版本D3(v5及以下),用回调式写法:
d3.json("你的JSON文件路径", function(error, postcards) { if (error) throw error; console.log("event -> "+ postcards.nodes[0].node.event); // 其他逻辑... });浏览器缓存或JSON响应不一致
有可能Chrome缓存了一份旧的、结构有问题的JSON(比如nodes数组为空),而Safari加载的是最新的正确数据。你可以打开Chrome的开发者工具(F12),切换到Network面板,刷新页面,找到你的JSON请求,查看返回的响应内容,确认nodes数组是否存在、第一个元素是否有node属性。如果是缓存问题,强制刷新页面(Ctrl+Shift+R)就能清除缓存加载最新数据。另外,也可以在代码里加一层安全判断,避免因为数据结构异常报错:
// 先检查数据结构是否符合预期 if (postcards?.nodes?.length > 0 && postcards.nodes[0].node) { console.log("event -> "+ postcards.nodes[0].node.event); } else { console.warn("数据结构不符合预期,请检查JSON内容:", postcards); }Drupal视图的输出差异
虽然可能性较低,但也可以确认下Drupal视图生成的JSON在不同请求下是否一致——比如有没有可能某些请求下返回的nodes是空数组?可以直接访问JSON的URL,在不同浏览器里看返回的内容是否完全相同。
内容的提问来源于stack exchange,提问作者PatriciaW

