2015-10-06 75 views
2

我通过d3.js更新显示对象

var line = d3.svg.line() 
var r = 1 


var svg = d3.select("body").append("svg:svg") 
    .attr("width", 1000) 
    .attr("height",1000) 

for (var x=0; x< 1000 ; x+=3*r) 
    { 
    for (var y=0; y< 1000 ; y+=3*r) 
    { 
     svg.append("circle") 
      .attr("cx", x) 
      .attr("cy", y) 
      .attr("r", r) 
    } 
    } 

fiddle

吸引很多圈与一些循环似乎在浏览器刷新循环已经完成后才会显示。然后所有对象立即出现。如何在每个元素之后强制刷新,以便我可以观察图像的进度?

感谢

+1

做一个少数在一个[的setTimeout]时间(https://developer.mozilla.org/en -US/docs/Web/API/WindowTimers/setTimeout)回调 –

+0

感谢您的提示。发了[小提琴比较两种(http://jsfiddle.net/ffdzvLrh/) – Franz657587

回答

0

我会单独创建的数据,然后使用一个过渡:

var data = []; 
for (var x=0; x< 1000 ; x+=3*r) { 
    for (var y=0; y< 1000 ; y+=3*r) { 
    data.push([x, y]); 
    } 
} 

svg.selectAll("circle").data(data).enter() 
    .append("circle") 
    .attr("cx", function(d) { return d[0]; }) 
    .attr("cy", function(d) { return d[1]; }) 
    .attr("r", r) 
    .attr("opacity", 0) 
    .transition() 
    .duration(100) 
    .delay(function(d, i) { return i * 100; }) 
    .attr("opacity", 1); 
+0

嗯,好了,'.opacity()'是不是D3的API的一部分,对不对?大拉尔斯摔倒了,你不会经常看到这种情况;-)无论如何,你是否有任何线索知道为什么这些圈子不会一个接一个地用OP的方法来绘制? – altocumulus

+0

感谢您的发现,修正了这个问题 - 我有时希望D3会让这些事情变得不那么冗长。我猜想,浏览器正在优化更新显示,因为圆圈添加得太快了,并且对于每个圆都不这样做,因为无论如何您几乎无法看到它。 –

+0

这很有效,但问题是我必须等很长时间才能浏览器开始显示任何东西。 [链接](http://jsfiddle.net/pyf3qsfw/)。 我不明白浏览器的单线程本质。所以浏览器无法在运行javascript循环的时候更新UI。解决方法是将控件返回到问题[链接]中的浏览器链接(http://stackoverflow.com/questions/5551378/javascript-pausing-execution-of-function-to-wait-for-user -input)。 – Franz657587