d3.js - NVD3 图表未在隐藏选项卡中正确呈现

标签 d3.js twitter-bootstrap-3 hidden-field nvd3.js bootstrap-tabs

我正在构建一个包含许多图表的页面,这些图表一次显示一个,具体取决于您正在查看的选项卡。

最初事件选项卡中的图表正确呈现。但是,当我单击另一个选项卡时,图表未正确呈现。

大概这是因为隐藏字段在变得可见之前没有维度。事实上,如果我调整窗口大小,图表将更正它的比例,并渲染以填充可用宽度。

我可以通过通过 css 显式定义图表大小来解决这个问题,但这会破坏图表的响应方面。

谁能告诉我如何触发相同的 NVD3 事件,该事件在窗口调整大小时被激活?这样我就可以将它绑定(bind)到新选项卡的选择上,并希望能解决渲染问题。

最佳答案

新答案的原因

Vanilla Javascript 在 2018 年对很多人来说是必要的。因为当今存在的许多框架和 Javascript 库都不能很好地与 jQuery 配合使用。曾几何时,使用 jQuery 解决方案回答所有 Javascript 问题是可以接受的,但它不再可行。

问题

加载 C3.js 或 D3.js 图表时,如果在页面加载期间视口(viewport)不在站点中,则图表无法正确呈现。

示例

  • 如果您输入 URL,然后打开一个新选项卡,然后在页面加载后返回。
  • 如果您刷新包含图表的页面,则最小化浏览器并在页面加载后将其打开。
  • 如果您刷新或转到带有图表的页面,然后滑动到计算机上的新窗口。然后在加载后返回带有图表的页面。

  • 在所有这些情况下,您的 C3.js/D3.js 图形将无法正确呈现。通常你会看到一个空白的 Canvas 。因此,如果您期待一个条形图,您会看到一个没有绘制条形的 Canvas 。

    背景

    虽然我已经看到这个问题得到了回答,但我需要一个符合 的答案。不是 使用 jQuery。现在我们已经到了 jQuery 无法解决所有问题的时代,我认为为这个问题提供一个普通的 Javascript 答案似乎很合适。

    我的团队面临的问题是,如果您刷新页面并滑开或最小化,C3.js/D3.js 图表将无法加载。基本上,如果您没有留在页面上并将其保留在站点中直到加载完成,您将不会看到图表,直到您再次调整页面大小。我知道这是每个使用 C3.js/D3.js 的人都会遇到的问题,但我们专门在 Salesforce 中使用 Lightning。

    回答

    我们的解决方法是在初始化图表的 Controller 函数中添加它。任何人都可以在他们编写的任何函数中使用它来初始化他们的 C3.js/D3.js 图,而不管他们的堆栈如何。这不依赖于 Salesforce,但如果您在 Salesforce 中遇到此问题,它确实有效。
    document.addEventListener('visibilitychange', () => {
       console.log(document.visibilityState);
       window.dispatchEvent(new Event('resize'));
    });
    

    关于d3.js - NVD3 图表未在隐藏选项卡中正确呈现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21563609/

    相关文章:

    javascript - 单击 selenium webdriver 中的样式 ="display: block;"

    php - 如何使隐藏字段安全?

    javascript - 如何在 d3js 中查找关联日期(x 轴)与最大值(y 轴)

    javascript - 在 JavaScript 和 D3 中按 YEAR-WEEK 模式解析日期

    jquery - Bootstrap : Mouse-enter animation issue with img-responsive [Opera only]

    javascript - 在 CSS 中正确设置动态高度动画

    asp.net - 在 ASP.NET 中,如何防止篡改隐藏字段值

    javascript - 将值传递给模态并显示为纯文本

    javascript - d3树节点位置

    css - 如何设置自定义导航栏和自定义折叠?手机右边不排队