2013-06-15 15 views
5

Jak mogę uruchomić przejście w trybie ciągłym w D3.js?D3.js: uruchamiać przejście w sposób ciągły?

Załóżmy na przykład, że chcę zmienić kolor body z czerwonego na niebieski iz powrotem, ciągle (nie, to byłoby przerażające, ale zrób z tym).

ten sposób zrobiłbym to raz:

d3.select("body").transition().duration(1000).style("background-color", "red"); 

Jak to zrobić w sposób ciągły?

Najbliższe przykłady widziałem używać d3.timer, ale nie jestem pewien, czy istnieje lepszy sposób to zrobić.

Odpowiedz

5

Można użyć transition.each() i zdarzenia "zakończenie". Kod wyglądałby jak poniżej.

function myTrans() { 
    d3.select("body").transition().duration(1000).style("background-color", "red") 
     .each("end", function() { 
     d3.select(this).transition().duration(1000).style("background-color", "blue") 
      .each("end", function() { myTrans(); }); 
     }); 
} 
+4

To wspaniała, dziękuję. Chociaż jestem trochę zdenerwowany, że może to ostatecznie zawiesić przeglądarkę - czy stopniowo zacznie przybierać coraz więcej pamięci? – Richard

+0

@Richard jest to funkcja rekursywna (jak sama się nazywa), więc powinien rzucić błąd dotyczący przekroczenia pewnego progu rozmiaru stosu. – SumNeuron

+0

@SumNeuron Wywołuje się rekursywnie, ale asynchronicznie, więc nigdy nie wyrzuci błędu wielkości stosu wywołań. – jessepinho

1

Dla D3 wersji 4 trzeba użyć .Na zamiast .each (na podstawie Lars odpowiedź):

function myTrans() { 
    d3.select("body").transition().duration(1000).style("background-color", "red") 
     .on("end", function() { 
     d3.select(this).transition().duration(1000).style("background-color", "blue") 
      .on("end", function() { myTrans(); }); 
     }); 
}