2014-11-13 7 views
10

Transition-Code,Wie geplante Verschiebung in D3 abbrechen?

d3.select('chart').select('svg') 
    .selectAll("circle") 
    .data(sampleData) 
    .enter().append('circle') 
    .each(function (d,i) 
      { 
       d3.select(this) 
        .transition() 
        .delay(i*50) 
        .attr('cx', function(d) {return d.x;}) 
        .attr('cy', function(d) {return d.y;}) 
        .attr('r', 4); 
      }); 

Wie kann ich die geplanten/verzögerte Transaktionen stoppen/stornieren?

Antwort

16

Wie in der anderen Antwort erwähnt, ist alles, was Sie brauchen, um einen neuen Übergang zu planen. Das Ganze ist jedoch viel einfacher als das, was Sie in Ihrem Code tun - die separate .each()-Funktion ist nicht erforderlich. Um zunächst die Übergänge zu planen, können Sie einfach

d3.select('chart').select('svg') 
    .selectAll("circle") 
    .data(sampleData) 
    .enter().append('circle') 
    .transition() 
    .delay(function(d, i) { return i*50; }) 
    .attr('cx', function(d) {return d.x;}) 
    .attr('cy', function(d) {return d.y;}) 
    .attr('r', 4); 

Die Funktion tun alle Übergänge zu stoppen (Linien- und Laufen) ist einfach

d3.selectAll("circle").transition(); 

komplette Demo here.

4

Das Starten eines neuen Übergangs für das Element stoppt jeden Übergang, der bereits ausgeführt wird. Sie können einen d3 Übergang Pause/Stopp einen neuen Übergang mit Dauer als 0.

function stopCircleTransitions(){ 
    if(startedApplyingTransitions) 
     d3.select('chart').select('svg') 
     .selectAll("circle") 
     .each(function(d,i){ 
      d3.select(this) 
       .transition() 
       .duration(0); 
     }); 
    } 
} 

indem Wenn Sie den Übergang stoppen möchte, wenn und nur wenn es gestartet wird, anwenden, können Sie den Code unten versuchen.

var startedApplyingTransitions = false; 
d3.select('chart').select('svg') 
    .selectAll("circle") 
    .data(sampleData) 
    .enter() 
    .append('circle') 
    .each(function (d,i){ 
     d3.select(this) 
      .transition() 
      .delay(i*50) 
      .attr('cx', function(d) {return d.x;}) 
      .attr('cy', function(d) {return d.y;}) 
      .attr('r', 4) 
      .each("end", function(){ //this code will do the trick 
       startedApplyingTransitions = true; 
      }); 
    }); 
+0

Vielen Dank für Ihre Antwort. In diesem Fall besteht aufgrund der Verzögerung die Gefahr, dass beim Ausführen des Codes die Animation überhaupt nicht gestartet wird. Es ist nur geplant, aber nicht gestartet. Ich habe das gleiche versucht, es funktioniert nicht. – SunnyShah

+0

Aktualisierte den Code, um zu prüfen, ob der Übergang bereits begonnen hat, seine Änderungen anzuwenden. Hoffe das hilft. – Gilsha

8

Die angenommene Antwort funktioniert nicht mit der neuesten Version von d3. Wenn Sie d3 v4 verwenden, sollten Sie .interrupt() auf Ihrer Auswahl anrufen.