Ответ 1
Это может быть выполнено, но с использованием API-интерфейсов D3 (см. примечание ниже).
Это пример http://bl.ocks.org/4747894, где:
- Элемент
brush
находится за кругами - Круги реагируют на событие
mousedown
. (Может также реагировать на другие события.) - Элемент
brush
хорошо себя ведет, даже если перетаскивание начинается из одного из кругов.
Некоторая трассировка и просмотр исходного кода D3 показывает, что extent
не является reset правильно, когда mousemove
событие запускается из элемента circle
поверх кисти. Это можно устранить, сбросив extent
для кисти в прослушивателе mousedown
для элементов circle
:
circles.on("mousedown", function (d, i) {
// _svg_ is the node on which the brush has been created
// x is the x-scale, y is the y-scale
var xy = d3.mouse(svg.node()),
xInv = x.invert(xy[0]),
yInv = y.invert(xy[1]);
// Reset brush extent
brush.extent([[xInv, yInv], [xInv, yInv]]);
// Do other stuff which we wanted to do in this listener
});
Примечание: В соответствии с API выбор кисти не будет обновлен автоматически при вызове .extent(values)
. Простое нажатие на круг будет reset extent
, но не будет перерисовывать сделанный выбор. Выбор будет отброшен только тогда, когда в circle
будет запущен другой выбор, или щелкнув вне кругов и текущий выбор. Это, как я понимаю, из желаемого поведения. Однако это может сломать код, который написан с предположением, что все, что есть extent
кисти, будет выбором, видимым на графике.