返回页面时如何阻止D3.js阻塞

返回页面时如何阻止D3.js阻塞,d3.js,c3.js,D3.js,C3.js,我目前有一个web应用程序,它使用原生d3图表和使用c3.js图表模块的图表 由于数据不断变化,我的图表每1-2秒更新一次,屏幕上随时可能出现3-4个图表 我注意到,如果我在chrome中更改选项卡或最小化窗口,当我返回到选项卡时,d3.js会花很长时间在d3\u timer\u步骤中完全锁定UI 5秒钟以上(取决于用户离开选项卡的时间),如果用户离开30分钟左右,这基本上可以锁定UI几分钟 我假设d3动画在窗口模糊时排队,然后在再次聚焦时敲打UI线程 显然,当窗口不可见时,我可以(而且可能无论

我目前有一个web应用程序,它使用原生d3图表和使用c3.js图表模块的图表

由于数据不断变化,我的图表每1-2秒更新一次,屏幕上随时可能出现3-4个图表

我注意到,如果我在chrome中更改选项卡或最小化窗口,当我返回到选项卡时,d3.js会花很长时间在d3\u timer\u步骤中完全锁定UI 5秒钟以上(取决于用户离开选项卡的时间),如果用户离开30分钟左右,这基本上可以锁定UI几分钟

我假设d3动画在窗口模糊时排队,然后在再次聚焦时敲打UI线程

显然,当窗口不可见时,我可以(而且可能无论如何都会)停止更新图表,但我的问题是,是否有其他人发现了这个问题,他们的解决方案是什么?e、 g.d3中是否有限制动画缓冲区或类似缓冲区的选项

我是C3维护人员


我猜您使用的是一个非常旧的C3版本(0.4.9);0.4.11修复了这个问题,我认为
data.load有一个bug。请尝试更新您的版本

在我的例子中,0.4.11不会改变任何东西(甚至chart.destroy()也不会做任何令人惊讶的事情)。核心问题是C3J继续安排d3转换,即使此时模糊和破坏。D3会推迟所有的转换,直到选项卡被聚焦,然后BAM-在单个阻塞请求中执行每个


如果是这种情况,您可以将图表的全局转换持续时间更改为
0
null
。大多数内部c3函数依赖转换持续时间作为执行转换或不执行转换的标志(在0的情况下)。

我将在d3js Github项目问题页面()上发布这一点。据我所知,动画不应该像这样排队,因为requestAnimationFrame应该处于非活动状态或大幅减少。@Bill,谢谢,关于requestAnimationFrame的说明给了我正确的路径。似乎因为暂停,转换正在排队,所以当焦点返回时,会有大量的转换积压,这会导致d3_定时器_步骤花费很长时间来处理积压。一个可能的解决方案似乎是使用selection.interrupt来减少转换次数。我还提出了一个问题,看看d3是否可以在内部做一些事情来改善体验。请参阅:
c3可能存在问题。你能用小提琴再现你的问题吗?当然。这是一个使用c3.js构建的图表(它似乎是罪魁祸首),只需在非活动选项卡上打开页面约2分钟,然后返回。你找到解决方案@NickB了吗?