2015-10-06 71 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