如何防止在调用brush.move之后触发d3画笔事件

nic*_*ick 1 brush d3.js

我正在并排显示几个相同的图表(显示不同的数据集)。刷一张图表时,应将其复制到所有其他图表上。

当前,我通过brush.moveselection有人刷过图表后立即调用除当前刷过的图表之外的所有图表中的一个来进行此操作。这是在brush-type eventListener中发生的。

但是,这brush.move会触发brush附加到笔刷的-type事件,从而导致错误(或更普遍地说,是无限循环)。

我该如何预防?

alt*_*lus 6

您可以使用该d3.event对象检查导致画笔更新的原因。从有关画笔事件的API文档中:

画笔事件

刷事件监听器被调用,d3.event被设置为当前刷事件。事件对象公开了几个字段:

  • sourceEvent -基础输入事件,例如mousemove或touchmove。

如果通过编程方式修改了画笔,即通过调用brush.move(),则该d3.event.sourceEvent属性将为null,因为没有输入事件导致此更新。在事件处理程序中,您可以检查此属性以跳过执行以进行编程更改:

if (!d3.event.sourceEvent) return;
Run Code Online (Sandbox Code Playgroud)

Mike Bostock在他的笔刷捕捉块中使用了相同的技术。在处理实际的输入事件时,再次修改画笔以捕捉到最接近的值,这显然不应触发事件处理程序的另一次运行。