2013-06-15 10 views
5

Come posso eseguire una transizione continuamente in D3.js?D3.js: eseguire una transizione continuamente?

Ad esempio, diciamo che voglio cambiare il colore body da rosso a blu e viceversa, continuamente (non lo faccio, sarebbe orrendo, ma andiamo con esso).

Questo è come vorrei farlo una volta:

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

Come potrei farlo in continuazione?

Gli esempi più vicini che ho visto utilizzano d3.timer, ma non sono sicuro che ci sia un modo migliore per farlo.

risposta

5

È possibile utilizzare transition.each() e l'evento "fine". Il codice sarebbe simile al seguente.

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

Questo è grande, grazie. Anche se sono un po 'nervoso che potrebbe causare il crash del browser - occuperà gradualmente sempre più memoria? – Richard

+0

@Richard questa è una funzione ricorsiva (così come si chiama), quindi dovrebbe generare un errore per quanto riguarda la dimensione dello stack superata da qualche soglia. – SumNeuron

+0

@SumNeuron Si chiama in modo ricorsivo, ma in modo asincrono, quindi non genera mai un errore di dimensione dello stack di chiamata. – jessepinho

1

Per D3 versione 4 è necessario utilizzare .on invece di .each (sulla base di Lars risposta):

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(); }); 
     }); 
}