Diese Frage ist ähnlich der one you posted in der d3-js Google Group. Ohne zu wiederholen, was ich dort geschrieben habe, möchte ich wiederholen, dass Sie wahrscheinlich d3.dispatch nicht möchten; Dies ist für benutzerdefinierte Ereignisabstraktionen (wie Pinsel und Verhalten) gedacht. Es wird einfacher sein, native Ereignisse zu verwenden.
Wenn Sie Ihre Legende wollen die Farbe der entsprechenden Leiste mit der Maus darüber zu ändern, dann Bruchs das Problem in Schritten:
- Detect Mouseover auf die Legende.
- Wählen Sie die entsprechende Leiste aus.
- Ändern Sie die Füllfarbe des Balkens.
Verwenden Sie zuerst selection.on für „Mouseover“ Ereignisse auf dem Legendenelement zu hören. Ihre Listener-Funktion wird aufgerufen, wenn Sie mit der Maus über ein Legendenelement gehen. Sie wird mit zwei Argumenten aufgerufen: den Daten (d
) und dem Index (i
). Sie können diese Informationen verwenden, um den entsprechenden Balken über d3.select auszuwählen. Zuletzt verwenden Sie selection.style, um den Füllstil mit der neuen Farbe zu ändern.
Wenn Sie nicht sicher sind, wie Sie den entsprechenden Balken bei Legendenmouseover auswählen, gibt es normalerweise mehrere Optionen. Die einfachste Methode ist die Auswahl nach Index unter der Annahme, dass die Anzahl der Legendenelemente und die Anzahl der Rect-Elemente identisch sind und in derselben Reihenfolge liegen. In diesem Fall, wenn eine lokale Variable rect
die rect Elemente enthält, könnte man sagen:
function mouseover(d, i) {
d3.select(rect[0][i]).style("fill", "red");
}
Wenn Sie nicht auf den Index verlassen wollen, eine weitere Option für die Anpassungsleiste auf identische Daten basieren zu scannen ist. Dies verwendet selection.filter:
function mouseover(d, i) {
rect.filter(function(p) { return d === p; }).style("fill", "red");
}
Eine weitere Option ist jede rect eine eindeutige ID zu geben, und wählen Sie dann von id. Zum Beispiel bei der Initialisierung, könnte man sagen:
rect.attr("id", function(d, i) { return "rect-" + i; });
Dann Sie die rect von ID mit der Maus darüber wählen könnten:
function mouseover(d, i) {
d3.select("#rect-" + i).style("fill", "red");
}
Das obige Beispiel ersonnen, da ich den Index verwendet, um die ID zu erzeugen Attribut (in diesem Fall ist es einfacher und schneller, die erste Technik der Auswahl nach Index zu verwenden). Ein realistischeres Beispiel wäre, wenn Ihre Daten eine Namenseigenschaft hätten; Sie könnten dann d.name
verwenden, um das ID-Attribut zu generieren, und ebenfalls nach ID auswählen. Sie können auch nach anderen Attributen oder Klassen auswählen, wenn Sie keine eindeutige ID generieren möchten.
Hallo Mike, vielen Dank für Ihre Hilfe auf diesem Zeug. D3 ist eine großartige Technologie und ich genieße es, sie zu lernen. - Frank –
FWIW Dieses Beispiel könnte einfach durch Hinzufügen einer: hover CSS-Regel zu den fraglichen SVG-Elementen implementiert werden. –
@HerbCaudill A: Die Hover-Regel ist in diesem Fall zu einschränkend: In diesem Beispiel wird veranschaulicht, wie andere Elemente als das Steuerelement geändert werden, für das die Option aktiviert ist (z. B. Legende in Balken). A: Hover-Regel funktioniert nur, wenn die Elemente, die Sie ändern möchten, dieselben sind, die sich befinden (z. B. Legende). Siehe meine andere Antwort zu [Auswahl und Änderung verwandter Elemente] (http://stackoverflow.com/questions/11206015/clicking-a-node-in-d3-from-a-button-outside-the-svg/11211391). – mbostock