d3.js:转换回调不会被enter()调用
d3.js: Transition callback is not called for enter()
我使用的是D3教程条形图的修改版本。
对我来说重要的是动画不应该在离开浏览器窗口时堆叠,然后在窗口再次聚焦时触发所有这些,导致浏览器挂起,所以根据这个建议,我试图使用setTimeout
而不是setInterval
,应该在动画结束时调用。
我有回调的问题,我不明白为什么简单的transition()
回调工作,但不是enter()
为例。
在我设置好图表&缩放,我的初始化函数是这样的:
function redrawTimer() {
data.shift();
data.push(next());
redraw(function(){
console.log('callback');
setTimeout(redrawTimer, 1500);
});
}
setTimeout(redrawTimer, 1500);
function redraw(callback) {
var rect = chart.selectAll("rect")
.data(data, function(d) { return d.time; });
rect.enter().insert("rect")
.attr("x", function(d, i) { return x(i + 1) - .5; })
.attr("y", function(d) { return h - y(d.value) - .5; })
.attr("width", w)
.attr("height", function(d) { return y(d.value); })
.attr("fill", "white")
.attr("fill-opacity", 0.2)
.transition()
.duration(1000)
.attr("x", function(d, i) { return x(i) - .5; })
.each('end', callback); // Doesn't work at all
rect.transition()
.duration(1000)
.attr("x", function(d, i) { return x(i) - .5; });
//.each('end', callback); // Works but for each of the 50 elements
rect.exit().transition()
.duration(1000)
.attr("x", function(d, i) { return x(i - 1) - .5; })
//.each('end', callback) // This only works after the first transition so using it to trigger the next data point is useless
.remove();
}
查看这个jsFiddle来摆弄代码:)
可能是我不完全理解transition()
在enter()
或exit()
或选择器上的工作方式不同。
你能开导我吗?
如果你可以使回调工作,但不能解决我上面提到的问题(浏览器离开时的动画),请帮助我,因为我会投票你的评论/答案。
编辑:
我通过测试过渡结束的元素来摆脱动画队列的堆积,并且只取最后一个:
rect.transition()
.duration(1000)
.attr("x", function(d, i) { return x(i) - .5; })
.each('end', function(d, i){
if(i == 49)
callback();
});
元素一次只能有一个活动过渡。rect.enter().transtition()
立即被rect.transition()
覆盖(rect
是更新选择,也包含输入元素!)。因此,rect.enter().transition().each('end', callback)
永远不会被调用。
有关更多信息,请参阅API文档或Mike的教程。
相关文章:
- JavaScript:在调用函数的文本输入上按enter键
- 如何在按Enter键后调用onclick函数
- 多次调用svg.selectAll(X).data().enter()
- 按 Enter 键并调用按钮函数
- 如何防止在按下“Enter”键时触发HREF(调用JS函数)
- “Enter”键在文本框处于活动状态时调用javascript函数
- 按ENTER键调用javascript函数
- 如何在html中按enter键时调用javascript函数
- 当用户在输入id=“”中填充文本时,如何调用函数java脚本;value_ 1”;然后按键盘上的“Enter”
- 如何通过在登录视图的密码输入字段中按enter键来调用函数
- Angular.js单元测试不调用$animate.enter回调
- 无法使用ENTER键调用函数
- 为什么onClick被enter键调用
- 使用Angular在Enter键上调用查询过滤器
- d3.js:转换回调不会被enter()调用
- 防止按下enter键时多次调用按键方法
- 为什么IE9在按enter键时调用get方法而不是post,如何修复?
- 如何在输入类型="文本"中按下Enter键后调用JavaScript函数
- 按Enter键调用javascript函数
- 在按下Enter键后调用onChange事件