Esta pregunta es similar al one you posted en el Grupo de Google d3-js. Sin duplicar lo que escribí allí, reiteraría que probablemente no desee d3.dispatch; que está destinado a abstracciones de eventos personalizados (como pinceladas y comportamientos). Será más simple usar eventos nativos.
Si desea que su leyenda para cambiar el color de la barra correspondiente al pasar el ratón, a continuación, la descomposición del problema en pasos:
- Detectar encima del ratón en la leyenda.
- Seleccione la barra correspondiente.
- Cambie el color de relleno de la barra.
En primer lugar, use selection.on para escuchar eventos de "mouseover" en los elementos de la leyenda. Se llamará a su función de escucha cuando el mouse vaya sobre un elemento de leyenda, y se le llamará con dos argumentos: los datos (d
) y el índice (i
). Puede usar esta información para seleccionar la barra correspondiente a través del d3.select. Por último, use selection.style para cambiar el estilo de "relleno" con el nuevo color.
Si no está seguro de cómo seleccionar la barra correspondiente en mouseover leyenda, por lo general hay varias opciones. El más sencillo es seleccionar por índice, suponiendo que el número de elementos de leyenda y el número de elementos rect son los mismos, y están en el mismo orden. En ese caso, si una variable local rect
contiene los elementos rect, se podría decir:
function mouseover(d, i) {
d3.select(rect[0][i]).style("fill", "red");
}
Si no quiere depender de índice, es otra opción para buscar la barra de juego basado en datos idénticos. Esto utiliza selection.filter:
function mouseover(d, i) {
rect.filter(function(p) { return d === p; }).style("fill", "red");
}
Otra opción es dar a cada Rect un identificador único, y luego seleccione por id. Por ejemplo, en la inicialización, se podría decir:
rect.attr("id", function(d, i) { return "rect-" + i; });
A continuación, puede seleccionar el rect por id en mouseover:
function mouseover(d, i) {
d3.select("#rect-" + i).style("fill", "red");
}
El ejemplo anterior se ideó desde que utiliza el índice para generar el id atributo (en cuyo caso, es más simple y más rápido usar la primera técnica de selección por índice). Un ejemplo más realista sería si sus datos tienen una propiedad de nombre; luego puede usar d.name
para generar el atributo id, y también seleccionar por id. También puede seleccionar por otros atributos o clases, si no desea generar una identificación única.
Hola Mike, gracias por toda su ayuda en esta materia. D3 es una gran tecnología y estoy disfrutando el tiempo aprendiéndola. - Frank –
FWIW Este ejemplo podría implementarse simplemente agregando una regla CSS: hover a los elementos SVG en cuestión. –
@HerbCaudill A: la regla de desplazamiento es demasiado restrictiva en este caso: este ejemplo muestra cómo modificar elementos distintos al que está siendo desplazado (por ejemplo, leyenda a barra). A: la regla de desplazamiento solo funciona si los elementos que desea modificar son los mismos que están suspendidos (por ejemplo, leyenda). Vea mi otra respuesta el [seleccionando y modificando elementos relacionados] (http://stackoverflow.com/questions/11206015/clicking-a-node-in-d3-from-a-button-outside-the-svg/11211391). – mbostock