代码之家  ›  专栏  ›  技术社区  ›  Florian Baierl

在tab处于后台时使用d3.js绘制SVG

  •  0
  • Florian Baierl  · 技术社区  · 8 年前

    上下文 :我正在开发一个webapp,它必须显示一些相当复杂且不断更新(每秒多次)的SVG图像。这些更新来自一个独立的服务器,一旦web前端收到更新,SVG就会立即更新。webapp是用 Scala.js d3js 图书馆(另见: scala-js-d3 ). 我们目前只支持谷歌浏览器。

    问题 :一旦webapp在后台选项卡中停留了一段时间,一旦再次导航到,整个网站就会失去响应。根据应用程序在后台的时间长短,有时应用程序需要20秒才能再次响应。我有办法解决这个问题吗?

    2 回复  |  直到 8 年前
        1
  •  1
  •   Florian Baierl    7 年前

    最适合我的解决方案非常简单:

    一旦应用程序处于后台选项卡或最小化(可以使用 Page Visibility API ),我只更新了我的模型,没有画任何东西。然后,一旦应用程序再次放到前台,我就重新绘制所有内容。这解决了我所有的性能问题。

        2
  •  1
  •   phk    7 年前

    我遇到了同样的问题,我没有在后台选项卡中进行转换来解决这个问题。

    mbostock 显示了一个很好的代码片段 https://github.com/d3/d3-transition/issues/93#issuecomment-516452828

    d3.selection.prototype.maybeTransition = function(duration) {
      return duration > 0 ? this.transition().duration(duration) : this;
    };
    

    使用方法如下:

    selection
      .maybeTransition(document.visibilityState === "visible" ? my_duration : 0)
        .attr(…
    

    捕捉页面可见性事件之后,甚至可以调整转换时间,以减少转换时间(从而加快转换速度),从而在页面没有处于后台选项卡的情况下,以大约相同的时间结束。

        3
  •  0
  •   Simon Groenewolt    8 年前

    您可以通过使用requestAnimationFrame()或监视选项卡可见性来修复此问题,并且只有在选项卡处于活动状态时才使用setInterval()。