¿Cómo acceder al elemento DOM que se correlaciona con un objeto SVG D3?


Estoy tratando de aprender D3 experimentando con uno de sus bubblecharts básicos . Primera tarea: averigua cómo arrastrar una burbuja y haz que se convierta en el objeto más alto mientras se arrastra. (El problema es conseguir que el modelo de objetos de D3 se mapee en el DOM, pero llegaré allí...)

Para arrastrarlo, simplemente podemos invocar el comportamiento de arrastre de d3 utilizando el código que proporcionan:

var drag = d3.behavior.drag()
    .on("dragstart", dragstart)
    .on("drag", dragmove)
    .on("dragend", dragend);

Funciona muy bien. Arrastra bien. Ahora, ¿cómo hacemos que sea el elemento más importante? Buscar por " svg z-index" aquí y se hace rápidamente evidente que la única manera de cambiar el índice es mover un objeto más abajo en el DOM. OK. No lo hacen fácil porque las burbujas individuales no tienen ID, pero jugando con la consola, podemos localizar uno de esos objetos de burbuja con:

$("text:contains('TimeScale')").parent()

Y podemos moverlo al final del elemento svg que lo contiene con:

.appendTo('svg')

Arrástrelo después de hacer eso, y es el elemento más importante. Hasta ahora, todo bien, si estás trabajando por completo dentro del DOM.

PERO: lo que realmente quiero hacer es que eso suceda automáticamente cada vez que se arrastra un objeto/burbuja dado. D3 proporciona un modelo para las funciones dragstart() y dragend() que nos permitirá incrustar una instrucción para hacer lo que queramos durante el proceso de arrastre. Y D3 proporciona la sintaxis d3.select(this) que nos permite acceder a la representación de objeto de d3 del objeto/burbuja que está arrastrando actualmente. Pero ¿cómo puedo convertir limpiamente esa matriz masiva que regresan en una referencia a un elemento DOM con el que puedo interactuar y, por ejemplo, moverlo al final del contenedor svg, o realizar otras referencias en el DOM, como el envío de formularios?

Author: ZachB, 2012-04-26

3 answers

También puede obtener el elemento DOM representado por una selección a través de selection.método node ()

var selection = d3.select(domElement);

// later via the selection you can retrieve the element with .node()
var elt = selection.node();
 160
Author: Tom Dunn,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-11-23 16:55:19

Cualquier elemento DOM en un documento SVG tendrá un ownerSVGElement propiedad que hace referencia al documento SVG en el que se encuentra.

Las selecciones de D3 son solo matrices anidadas con métodos adicionales en ellas; si tiene .select()ed un único elemento DOM, puede obtenerlo con [0][0], por ejemplo:

var foo = d3.select(someDOM);

// later, where you don't have someDOM but you do have foo
var someDom = foo[0][0];
var svgRoot = someDom.ownerSVGElement;

Tenga en cuenta, sin embargo, que si está utilizando d3.select(this) entonces this ya es el elemento DOM; no necesita envolverlo en una selección D3 solo para desenvolverlo.

 30
Author: Phrogz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-04-26 20:56:10

Puede asignar ID y clases a los elementos individuales si lo desea cuando agrega:

node.append("circle.bubble")
.attr("r", function(d) { return d.r; })
.style("fill", function(d) { return fill(d.packageName); })
.attr("id", function(d, i) { return ("idlabel_" + i)})
.attr("class", "bubble")
;

Y luego puede seleccionar por clase con selectAll("circle.bubble") o seleccione por id y modifique los atributos de la siguiente manera:

var testCircle = svg.select("#idlabel_3")
.style("stroke-width", 8);
 11
Author: Elijah,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-04-26 18:12:33