如何防止调用后触发 d3 刷事件 brush.move
How to prevent d3 brush events from firing after calling brush.move
我并排显示几个相同的图表(显示不同的数据集)。在一张图表上刷完后,刷子应该复制到所有其他图表上。
目前,我通过在不包括当前刷过的图表的所有图表的 selection
上调用 brush.move
来做到这一点,一旦有人刷过图表。这发生在 brush
类型的 eventListener 中。
但是,此 brush.move
会触发附加到画笔的 brush
类型的事件,从而导致错误(或者,更一般地,无限循环)。
我怎样才能避免这种情况?
您可以使用d3.event
对象来查看是什么导致了刷机的更新。来自 brush events 上的 API 文档:
Brush Events
When a brush event listener is invoked, d3.event is set to the current brush event. The event object exposes several fields:
- …
sourceEvent
- the underlying input event, such as mousemove or touchmove.
如果您的画笔以编程方式修改,即通过调用 brush.move()
,d3.event.sourceEvent
属性 将为空,因为没有输入事件导致此更新。在您的事件处理程序中,您可以检查此 属性 以跳过程序更改的执行:
if (!d3.event.sourceEvent) return;
Mike Bostock 在他的 Brush Snapping Block 中采用了相同的技术。在处理实际输入事件时,再次修改画笔以捕捉到最近的值,显然,这不应触发事件处理程序的另一个 运行。
我并排显示几个相同的图表(显示不同的数据集)。在一张图表上刷完后,刷子应该复制到所有其他图表上。
目前,我通过在不包括当前刷过的图表的所有图表的 selection
上调用 brush.move
来做到这一点,一旦有人刷过图表。这发生在 brush
类型的 eventListener 中。
但是,此 brush.move
会触发附加到画笔的 brush
类型的事件,从而导致错误(或者,更一般地,无限循环)。
我怎样才能避免这种情况?
您可以使用d3.event
对象来查看是什么导致了刷机的更新。来自 brush events 上的 API 文档:
Brush Events
When a brush event listener is invoked, d3.event is set to the current brush event. The event object exposes several fields:
- …
sourceEvent
- the underlying input event, such as mousemove or touchmove.
如果您的画笔以编程方式修改,即通过调用 brush.move()
,d3.event.sourceEvent
属性 将为空,因为没有输入事件导致此更新。在您的事件处理程序中,您可以检查此 属性 以跳过程序更改的执行:
if (!d3.event.sourceEvent) return;
Mike Bostock 在他的 Brush Snapping Block 中采用了相同的技术。在处理实际输入事件时,再次修改画笔以捕捉到最近的值,显然,这不应触发事件处理程序的另一个 运行。