我正在构建一个几乎所有客户端 Javascript 的交互式可视化应用程序,请参见此处:
http://korhal.andrewmao.net:9294/#/classify/APH10154043
尝试以下控件:
- 鼠标滚轮:缩放
- 拖动空白区域:平移
- 拖动底部区域或手柄:平移/缩放
- 单击一次,然后再次单击:绘制一个框
- 拖动框:移动框
- 拖动框的边缘:调整大小
底层机制是一个覆盖在画布上的 SVG。画布有z-index
0 和 SVG z-index
1 - 随意检查 DOM。在 Chrome/Firefox 上一切正常。
问题是,在 IE9 中,画布似乎通过 SVG 接收点击事件,即使 z-index 较低。您可以判断,因为鼠标滚轮/单击/拖动操作在主图表区域不起作用,但它们在边缘区域起作用,因为 SVG 比画布稍大,它会在那里接收事件。例如,尝试在轴区域或底部滚动鼠标。
玩了一会儿之后,我想我看到了病态。我制作了一个页面版本,允许在画布(图形)区域之外绘制框,但仍在 SVG 内部。然后我可以执行以下操作(在 IE 中):
- 在轴区域(画布外)绘制一个框
- 将其拖到主要区域(在画布上)
- 将鼠标悬停在框上并使用鼠标滚轮 - 现在缩放事件被 SVG 拾取。没有框的鼠标滚轮导致事件进入画布(消失。)
所以看起来正在发生的事情是,当鼠标下有一个明确的 SVG 对象时,SVG 只会拾取鼠标事件,否则它会被传递到画布,并且只在 Internet Explorer 中。
解决这个问题的一个明显方法是在整个 SVG 区域上制作一个透明的矩形,但这似乎很愚蠢。另外,也许我做错了什么,在使用 Chrome 时已修补但在 IE 中已损坏。有没有人有什么建议?
注意:一个(已删除)答案建议将整个 SVG 区域包装在一个<g>
元素中并应用于pointer-events: all
它。然而,这并没有奏效。我什至不认为这是必要的,因为在整个 SVG 区域中都可以很好地检测到指针事件,除了有画布的地方。