2016-12-06 2 views
0

I eine Kraft Layout mit der folgenden Struktur:die XY-Koordinaten in einem d3 Ziehereignis invertierende

<svg width="300" height="220"> 
    <g class="scaleWrapper" transform="scale(0.3)"> 
     <g class="transformWrapper" transform="translate(-110, -80)"> 
      <g class="backgroundWrapper"> 
       <rect class="backgroundRect" width="300" height="220"></rect> 
      </g> 
      <g class="forceNode"></g> 
      <g class="forceNode"></g> 
      <g class="forceLink"></g> 
     </g> 
    </g> 
</svg> 

I auch ein Schleppverhalten der rect verbunden, um es zu schleppen (Skalierung durch eine behandelt wird separater Schieberegler).

 let transformElement = d3.select('.transformWrapper'); 
     let svgBackground = transformElement.append('g') 
      .classed('backgroundWrapper', true); 

     function originFunction() { 
      let d = d3.select('.transformWrapper'); 
      return { 
       x: d.attr('x'), 
       y: d.attr('y') 
      }; 
     } 

     let svgDrag = d3.behavior.drag() 
      .origin(originFunction) 
      .on('dragstart', function(){ 
       d3.event.sourceEvent.stopPropagation(); 
      }) 
      .on('drag', function(){ 
       transformElement.attr("transform", `translate(${d3.event.x}, ${d3.event.y})`); 
      }); 

     svgBackground.call(svgDrag); 

Es funktioniert meistens, aber es springt herum, während ich es schleppe. Ich ein Protokoll tat und sah, dass das d3.event Objekt zwischen relativen XY-Koordinaten und Unbedingten abwechselt, ist hier eine Probe von dem, was ich sehe:

-111 -80 
-29 -6 
-110 -80 
-29 -5 

Ich habe keine anderen Elemente sehen, das Verhalten an sie gebunden. Alle d3.event-Objekte haben die Eigenschaft 'drag' und dasselbe srcElement. Wie kann ich die Ereignisse zum Schweigen bringen, die die relativen Positionen zurückgeben?

Antwort