3

我想知道如何处理 d3.js 中的中断转换不会触发结束事件的事实。正如 API 文档所说

请注意,如果过渡被给定元素上稍后安排的过渡所取代,则不会为该元素调度结束事件;中断的转换不会触发结束事件。来自:https ://github.com/mbostock/d3/wiki/Transitions#control

在我的例子中,转换是由用户交互触发的。当用户通过鼠标点击触发新的过渡时,这些过渡可能会被中断。假设在第一个转换中,一个元素打算淡出并在转换结束时被移除。如果此转换被中断,则元素将永远不会被删除。我可以在过渡期间禁止进一步的用户交互,但这并不是我真正想要的(特别是因为我有后退和前进按钮,允许用户快速单击我的 svg 图的先前状态......)基本上我会需要一个“中断事件”

谢谢

马丁

4

1 回答 1

1

我认为没有真正令人满意的方法可以做到这一点。一个有点痛苦的解决方法是计算当前发生的转换次数并从中推理。

所以,初始化:

var transitionCount = 0;

每当您安排新的过渡时:

if ( transitionCount != 0 ) {
    // handle interrupted transitions here somehow
    transitionCount = 0;
}
var myTransition = selection.transition().... ; 
transitionCount += myTransition.size();
myTransition.each('end', function() { transitionCount --; });

如果您可以像这样手动清理中断的转换,那就没问题了。请注意,您不能使用“开始”事件来增加计数器,因为在安排转换和开始转换之间存在延迟,因此您会在那里获得竞争条件。

于 2014-11-10T10:24:59.167 回答