【问题标题】:SVG Path Hit-TestingSVG 路径命中测试
【发布时间】:2012-08-25 12:12:50
【问题描述】:

我在检测 SVG 路径元素上的鼠标悬停事件时遇到问题。似乎路径元素的 strokeWidth 越小,检测鼠标悬停的成功率就越低。

另外,我正在使用 jquery-svg 插件进行绘图。

下面是尝试在路径元素上使用 jquery mouseover 事件检测的小提琴。 Mouseover Fiddle

下面是尝试通过将 mousemove 侦听器附加到 svg,然后使用 document.getElementFromPoint 来进行检测。 getElementFromPoint Fiddle

这些似乎都不能可靠地工作,尤其是在鼠标快速移动的情况下。是否可以使这些中的任何一个更敏感以更好地检测鼠标悬停?或者也许有更好的方法?

【问题讨论】:

    标签: javascript jquery svg mouseover jquery-svg


    【解决方案1】:

    浏览器的工作方式是,您不会连续收到mouseover 事件,但每次操作系统更新光标位置时您都会收到一个。如果鼠标移动得很快,你会得到一个相隔几个像素的事件。鼠标不会在文档上滑动,而是跳跃Here's a jsfiddle 显示每个事件发生的位置。您无法为光标的两个连续位置之间的所有元素获取 mouseover 事件。

    您可以做一些不同的事情:记住mousemove 事件的先前位置,计算该点与当前鼠标位置之间的线,并计算该线与文档中所有其他形状之间的所有交点。但这将是资源密集型的,因为没有可用的 API,您必须自己计算交叉点。有一个library可以帮助你。

    【讨论】:

    • w3.org/TR/SVG11/… 是一个 SVG DOM API,用于获取与给定矩形(在本例中为鼠标移动线)相交的所有元素。
    • 对,但是有两个问题:检查两点之间的整个矩形,而不仅仅是线,但这还不错;另一个是it's not implemented yet in Firefox
    • 后者是我最关心的,我刚刚使用@Eriks 的建议测试了我的解决方案,它在Firefox 中不起作用
    • @SergiuDumitriu 我采纳了您的建议并自己计算了交叉点。谢谢你的建议。此外,您的小提琴显示每个事件发生的位置非常有用,我没有意识到 mousemove 和其他事件是如何工作的。
    猜你喜欢
    • 2011-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-24
    • 2011-09-29
    • 2017-05-07
    • 2012-03-16
    相关资源
    最近更新 更多