Этот вопрос похож на тот, который вы опубликовали в группе Google d3-js. Не дублируя то, что я там написал, я повторю, что вы, вероятно, не хотите d3.dispatch; это предназначено для пользовательских абстракций событий (таких как кисти и поведение). Будет проще использовать нативные события.
Если вы хотите, чтобы ваша легенда изменила цвет соответствующей полосы при наведении мыши, разбейте проблему на шаги:
- Обнаружение наведения мыши на легенду.
- Выберите соответствующий бар.
- Изменить цвет заливки бара.
Сначала используйте selection.on , чтобы прослушивать события «наведения мыши» на элементах легенды. Ваша функция слушателя будет вызвана, когда мышь наведет курсор на элемент легенды, и будет вызвана с двумя аргументами: данные (d
) и индекс (i
). Вы можете использовать эту информацию для выбора соответствующей панели с помощью d3.select . Наконец, используйте selection.style , чтобы изменить стиль «заливки» новым цветом.
Если вы не уверены, как выбрать соответствующую полосу при наведении курсора, обычно есть несколько вариантов. Наиболее простым является выбор по индексу, предполагая, что количество элементов легенды и количество прямоугольных элементов одинаковы и находятся в одинаковом порядке. В этом случае, если локальная переменная rect
содержит прямоугольные элементы, вы можете сказать:
function mouseover(d, i) {
d3.select(rect[0][i]).style("fill", "red");
}
Если вы не хотите полагаться на индекс, другой вариант состоит в том, чтобы сканировать совпадающую полосу на основе идентичных данных. Используется selection.filter :
function mouseover(d, i) {
rect.filter(function(p) { return d === p; }).style("fill", "red");
}
Еще один вариант - присвоить каждому прямоугольнику уникальный идентификатор, а затем выбрать по идентификатору. Например, при инициализации вы можете сказать:
rect.attr("id", function(d, i) { return "rect-" + i; });
Затем вы можете выбрать прямоугольник по идентификатору при наведении мыши:
function mouseover(d, i) {
d3.select("#rect-" + i).style("fill", "red");
}
Приведенный выше пример является надуманным, поскольку я использовал индекс для генерации атрибута id (в этом случае проще и быстрее использовать первый метод выбора по индексу). Более реалистичным примером будет, если ваши данные имеют свойство name; затем вы можете использовать d.name
для генерации атрибута id, а также выбрать по id. Вы также можете выбрать другие атрибуты или класс, если вы не хотите генерировать уникальный идентификатор.