D3.js 如何防止调用brush.move后触发d3笔刷事件

D3.js 如何防止调用brush.move后触发d3笔刷事件,d3.js,brush,D3.js,Brush,我正在显示几个相同的图表,并排显示不同的数据集。在一张图表上刷涂时,应在所有其他图表上复制刷涂 目前,我通过调用brush.move来实现这一点,只要有人在图表上画笔,就可以选择除当前画笔图表之外的所有图表。这在笔刷类型的eventListener中发生 但是,此brush.move会触发附加到笔刷的笔刷类型事件,从而导致错误,或者更一般地说,导致无限循环 如何防止这种情况发生?您可以使用d3.event对象来检查导致笔刷更新的原因。从API文档中: 刷牙事件 调用时,设置为当前笔刷事件。事件对

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

目前,我通过调用brush.move来实现这一点,只要有人在图表上画笔,就可以选择除当前画笔图表之外的所有图表。这在笔刷类型的eventListener中发生

但是,此brush.move会触发附加到笔刷的笔刷类型事件,从而导致错误,或者更一般地说,导致无限循环

如何防止这种情况发生?

您可以使用d3.event对象来检查导致笔刷更新的原因。从API文档中:

刷牙事件 调用时,设置为当前笔刷事件。事件对象公开了几个字段:

… sourceEvent—底层输入事件,如mousemove或touchmove。 如果以编程方式修改画笔,即调用brush.move,则d3.event.sourceEvent属性将为null,因为没有输入事件导致此更新。在事件处理程序中,您可以检查此属性以跳过编程更改的执行:

if (!d3.event.sourceEvent) return;
迈克·博斯托克(Mike Bostock)在他的街区也采用了同样的技术。在处理实际输入事件时,将再次修改画笔以捕捉到最近的值,这显然不应触发事件处理程序的另一次运行。

您可以使用d3.event对象检查画笔更新的原因。从API文档中:

刷牙事件 调用时,设置为当前笔刷事件。事件对象公开了几个字段:

… sourceEvent—底层输入事件,如mousemove或touchmove。 如果以编程方式修改画笔,即调用brush.move,则d3.event.sourceEvent属性将为null,因为没有输入事件导致此更新。在事件处理程序中,您可以检查此属性以跳过编程更改的执行:

if (!d3.event.sourceEvent) return;

迈克·博斯托克(Mike Bostock)在他的街区也采用了同样的技术。在处理实际输入事件时,将再次修改画笔以捕捉到最近的值,这显然不会触发事件处理程序的另一次运行。

谢谢,这很有帮助!但是,sourceEvent属性不为null。在这种情况下,sourceEvent是一个笔刷事件。我调整了您的解决方案:我使用d3.event.sourceEvent.type==Brush作为测试条件。@nick Hm,这可能是由您的特定设置引起的。通过检查我链接到的块,sourceEvent在第二次运行期间无疑是空的;如果代码有任何不同,它就不会工作。。。不管怎样,很高兴它帮助你开始。谢谢,这很有帮助!但是,sourceEvent属性不为null。在这种情况下,sourceEvent是一个笔刷事件。我调整了您的解决方案:我使用d3.event.sourceEvent.type==Brush作为测试条件。@nick Hm,这可能是由您的特定设置引起的。通过检查我链接到的块,sourceEvent在第二次运行期间无疑是空的;如果代码有任何不同,它就不会工作。。。不管怎样,很高兴它帮助你开始了。