Ich möchte einen Text in einer d3-Visualisierung für den Einsatz in einem Editor ziehbar machen. Ich begann mit den Beispielen zu spielen (http://bl.ocks.org/mbostock/4063550). Wenn ich dem Textelement einen Dragbehavier hinzufüge, kann ich anhand der ChromeDevTools erkennen, dass etwas gezogen wird, aber es gibt keine visuelle Darstellung dieses Ziehens. Ich habe auch versucht, es mit JQuery UI zu tun, was auch nicht funktioniert hat. Was vermisse ich und ist das überhaupt möglich?Einen SVG-Text ziehbar machen mit d3.js
Antwort
Sie können drag.behaviour verwenden, um Drag-Events zu Elementen hinzuzufügen.
1) Erstellen einer Funktion, um die Drag-Ereignis zu behandeln (vom Typ d3.event):
function dragmove(d) {
d3.select(this)
.style("top", ((d3.event.sourceEvent.pageY) - this.offsetHeight/2)+"px")
.style("left", ((d3.event.sourceEvent.pageX) - this.offsetWidth/2)+"px")
}
2) Erstellen drag Verhalten die obige Funktion als Handler:
var drag = d3.behavior.drag()
.on("drag", dragmove);
3) Bind es auf ein Element oder einen Satz von Elementen auf einer .call
d3 Selektion mit:
d3.select("body").append("div")
.attr("id", "draggable")
.text("Drag me bro!")
.call(drag)
Probieren Sie es aus: http://jsfiddle.net/HvkgN/2/
Hier ist das gleiche Beispiel adapted for an svg text element:
function dragmove(d) {
d3.select(this)
.attr("y", d3.event.y)
.attr("x", d3.event.x)
}
var drag = d3.behavior.drag()
.on("drag", dragmove);
d3.select("body").append("svg")
.attr("height", 300)
.attr("width", 300)
.append("text")
.attr("x", 150)
.attr("y", 150)
.attr("id", "draggable")
.text("Drag me bro!")
.call(drag)
Eine schönere Art und Weise zu einem SVG-Element hinzuzufügen, ziehen zu verwenden ist ein translate transformieren, das die verschiebbare Element bewegt sich. Koppeln Sie dies mit einem Drag-Ereignishandler, der d3.event.dx und d3.event.dy verwendet, um die Bewegung der Maus zu überwachen.
var transX = 0;
var transY = 0;
var theElement = d3.select('svg#xyz text.blahblah').attr('transform', "translate(" + transX + ", " + transY + ")");
var repositionElement = function(data) {
transX += d3.event.dx;
transY += d3.event.dy;
theElement.attr('transform', "translate(" + transX + ", " + transY + ")");
};
var addDragging = function (element) {
element.call(d3.behavior.drag().on('drag', repositionElement));
};
addDragging(theElement);
Auch im Gegensatz zu ändern x/y diese Technik kann direkt verwendet werden, eine ganze <g>
Gruppe ziehbar zu machen, so dass, wenn der Benutzer klickt und zieht einen Teil der Gruppe, die ganzen Gruppe bewegt!
- 1. machen d3.js kompatibel mit IE8/IE9
- 2. D3.js Hinzufügen ziehbar Kreisen funktioniert nicht, wenn einzelne Zugabe
- 3. Angular mit D3 js
- 4. D3.js Visualisierung mit node.js
- 5. macht einen Bogen in d3.js
- 6. Mit Lenker mit D3.js
- 7. Dart js Interop mit D3
- 8. D3.js: einen Übergang kontinuierlich ausführen?
- 9. Datum Sortierung mit d3.js
- 10. d3.js: fügen Sie einen Bereich mit Glyphon-Klasse an
- 11. Interaktives Liniendiagramm mit d3.js
- 12. D3.JS 'Zoom' undefined
- 13. eine Objekthierarchie mit d3.js
- 14. Hierarchisches Kraftdiagramm mit D3.js
- 15. Parallele Koordinaten mit d3.js
- 16. Parsing Zeitreihendaten mit D3.js
- 17. d3.js: pan mit Grenzen
- 18. NVD3/D3.js machen xAxis Zeichenfolge aus dem Datumsformat
- 19. So aktualisieren Sie einen SVG-Pfad mit d3.js
- 20. D3.js Enter Animation
- 21. d3.js Umgang mit nicht-Svg-Browsern
- 22. d3.js v4 d3.layout.tree wurde entfernt?
- 23. Constrained d3.js Force-Anzeige
- 24. Suchfunktion auf D3.js
- 25. Machen Sie x3dom 3D nicht ziehbar
- 26. d3.js Achsen-Ticks anklickbar
- 27. Bounding Box in D3.js
- 28. d3.js Kartenlinien unterbrochen
- 29. Einfärben einer Karte mit D3.js
- 30. d3.js Update Balkendiagramm Tooltip mit Tasten
Sorry das ist nicht was ich meinte .. Ich habe SVG Text Elemente, die ich ziehen muss und sie nicht auf .call (ziehen) reagieren – chenninger
@chenninger Ist das nicht, was das Beispiel hier tut? – Phrogz
@chenninger Ich habe das Beispiel für ein SVG-Textelement aktualisiert! Entschuldigung für die Verwirrung. – minikomi