通过 Chrome 中的 Fetch API 在 D3 v5 中加载 JSON?

Posted

技术标签:

【中文标题】通过 Chrome 中的 Fetch API 在 D3 v5 中加载 JSON?【英文标题】:Loading JSON in D3 v5 via Fetch API in Chrome? 【发布时间】:2019-01-07 05:05:35 【问题描述】:

在 Chrome 中运行以下代码时,d3.json 回调不会触发,直到 pubs.json 加载到另一个浏览器选项卡/窗口中。当d3.json 粘贴到 Chrome 浏览器控制台时它可以工作,如果在 Firefox 中运行它也可以工作......

我在 localhost 上使用 Python 的 http.server

为什么它在 Chrome 中会这样?

目录结构:

proj/
  index.html
  pubs.json

代码:

<html>
  ...
  <body>
    ...
    <script>
        $(document).ready(function()
            d3.json("/pubs.json").then(function(data) 
                console.log(data);
            );
        );
    </script>
  </body>
</html>

【问题讨论】:

“直到pubs.json 加载到另一个浏览器选项卡/窗口”是什么意思?您有重现问题的链接吗? 脚本标签应该在正文标签内。这只是重写这篇文章时的错字吗? 我知道这可能是一个愚蠢的问题,但是您是否检查过您是否正在运行适当的服务器来测试该代码? javascript 在没有适当权限的情况下通常有一些限制,虽然 firefox 和 safari 可以让您在一定程度上规避这一点,但 chrome 不会。 @ManuelAlejandroCaetano 可能不是“正确的”。我正在使用 Python 的http.server。以为我以前从未遇到过这个问题。 @PierreCapo 我的意思是——据我所知——承诺在加载页面时等待处理。然后,如果在另一个浏览器选项卡/窗口中,我加载 &lt;host&gt;/pubs.json 承诺在原始选项卡/窗口中实现。 【参考方案1】:

Chrome 对 CORS (Same Origin) 很迂腐

尝试以下方法:

d3.json(chartURL, credentials: 'same-origin').then(function(data) 
    ....
);

如果文件是由另一个选项卡加载的,它可以在缓存中找到,那么要求可能不再那么严格了。

【讨论】:

以上是关于通过 Chrome 中的 Fetch API 在 D3 v5 中加载 JSON?的主要内容,如果未能解决你的问题,请参考以下文章

在 Chrome 扩展中使用时,Fetch API 不发送会话 cookie

Chrome iOS 58 中 fetch API 返回的 TypeError

Chrome - Fetch API 无法加载文件。如何解决?

使用 Javascript fetch 命令从 google chrome 控制台请求新闻 API 运行命令时出现问题

使用 window.fetch api 的预检请求失败

Safari 不使用 JS Fetch API 设置 CORS cookie