2013-06-15 2 views
5

Как я могу выполнить переход непрерывно в D3.js?D3.js: выполнить переход непрерывно?

Например, я хочу изменить цвет body с красного на синий и обратно, непрерывно (я не хочу, это было бы ужасно, но идти с ним).

Это, как я хотел бы сделать это один раз:

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

Как бы я это делать постоянно?

Ближайшие примеры, которые я видел, используют d3.timer, но я не уверен, есть ли лучший способ сделать это.

ответ

5

Вы можете использовать transition.each() и событие «конец». Код будет выглядеть примерно так:

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

Это здорово, спасибо. Хотя я немного нервничаю, что это может привести к краху браузера в конце концов - будет ли он постепенно занимать все больше и больше памяти? – Richard

+0

@Richard это рекурсивная функция (как она сама вызывает), поэтому она должна вызывать ошибку относительно превышения порогового размера стека. – SumNeuron

+0

@SumNeuron Он называет себя рекурсивно, но асинхронно, поэтому никогда не будет вызывать ошибку размера стека вызовов. – jessepinho

1

Для D3 версии 4 вы должны использовать .он вместо .each (на основе Lars ответа):

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(); }); 
     }); 
} 
Смежные вопросы