D3 事件在隐藏的 svg 元素上触发

D3 events firing on a hidden svg element

我似乎找不到这个问题的答案,我花了一段时间将它重新创建为一个独立的 fiddle/pen 但我终于找到了。

我正在开发使用 D3 绘制和操作 svg 图形的 Vaadin 应用程序。 在某一点上,屏幕上有 svg,其中有 visibility:hidden.

这在所有浏览器中都能完美找到。

这些隐藏元素有点击和鼠标悬停事件,在所有浏览器中都能找到 但是在 firefox 版本 34 中,隐藏元素仍然会在它们仍然隐藏时触发它们的事件(单击和鼠标悬停)。

为了更好地解释:隐藏按钮时,不应触发其鼠标悬停事件,而应在其可见时触发。这就是它在所有浏览器中的工作方式,除了 firefox 34、35 beta 和 36 开发版。它在 firefox 31 中运行良好。

我怀疑这是 D3 中的错误,但希望获得第二意见或有人指出我的错误。值得注意的是,在元素上设置 display:none 在 firefox 34 及更高版本中有效,但我不认为问题出在那里

我已经创建了一个演示代码的 jsbin,有两个橙色图标,如果您将鼠标悬停在没有 chrome 的隐藏元素上,一个带有 visibility:hidden(您可能需要禁用才能看到它)发生。但是对于 firefox 34,事件会发生。 Here's the jsBin

知道它为什么会火吗?我猜是 D3 问题还是 Firefox 错误,但是我想确定它以修复我的代码以帮助修复其他领域

谢谢

spec 声明这是正常行为:

Depending on the value of property ‘pointer-events’, graphics elements which have their ‘visibility’ property set to hidden still might receive events.

作为解决方法,您可以使用 display: none 或将 pointer-events: none 添加到您的 class 和 visibility: hidden

这只是 Firefox 中的一个错误。如果你report it我会解决它

给定指针事件的特定值,我们可以准确地说出该元素是否应该接收事件。如果我们不知道 pointer-events 有什么值,那么该元素可能会或可能不会接收指针事件。这就是规范试图说明的全部内容。这里没有歧义。

请注意,firefox 错误仅影响 <image> 个元素。如果用 <rect> 元素替换图像,即使在 Firefox 中也应该会看到正确的结果。