【问题标题】:d3js: How to stop all transitions?d3js:如何停止所有转换?
【发布时间】:2015-05-19 15:55:57
【问题描述】:

我有一个带有 d3js 和 turbolinks(ajax 导航)的网络应用程序。

我的一些页面包含长时间的转换(超过 100 秒),因此当使用 AJAX 重新加载页面的一部分时,上一页的所有转换仍在运行。

如何完全从原始页面中删除所有过渡?

turbolinks 中有一个名为“page:before-unload”的事件,所以我打算用它来进行清理。

【问题讨论】:

  • 您只需要在所有附加了过渡的元素上调用.transition()
  • 感谢您的回复,但如果存在,我正在寻求通用解决方案。
  • 不确定您所说的“通用解决方案”是什么意思——这适用于任何情况。
  • 只有当我可以访问源代码并且我将所有转换的引用存储在某处时,它才会在所有情况下工作。我更喜欢一种可以在任何 d3js 页面(不仅是我的页面)上工作的解决方案,并且在 SVG/canvas/html 被销毁时清除所有转换。
  • 哦,是的,你是对的——太明显了 :) 在这种情况下,问题是你在用于初始化转换的闭包中保留了对 rect 的引用.因此,通过删除周围的元素,您并没有真正删除它,因为 rect 仍然存在于正在执行的函数中(正在运行的转换)。

标签: ajax d3.js transition turbolinks


【解决方案1】:

看看你的 cmets,我认为这会起作用:

d3.selectAll('*').transition();

但是正如 Lars Kotthoff 所说,当 svg/canvas 被销毁时,过渡也会被销毁,所以如果你正在销毁 svg/canvas,则不需要这样做。

【讨论】:

  • 请注意,如果有很多元素,这会很慢。
  • 我看不到任何方法可以获取所有附加了转换的元素,但它仍然比修改(不是我的)工作代码并将所有转换存储在某处要好。也许还有其他方法?
  • 其实我可以添加一个类似“loopedTransitionElement”的类,然后通过d3.selectAll('.loopedTransitionElement').transition()查询所有元素来停止我需要停止的所有转换。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-07-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-20
  • 2015-12-26
相关资源
最近更新 更多