2012-08-30 5 views
2

У меня возникают проблемы с обнаружением событий mouseover на элементах пути SVG. Похоже, что чем меньше ширина штриха для элемента пути, тем меньше у меня успеха при обнаружении мыши.SVG Path Hit-Testing

Кроме того, я использую плагин jquery-svg для рисования.

Ниже приведена скрипка поиска с использованием события jQuery mouseover на элементе пути. Mouseover Fiddle

Ниже приведена скрипка попыток обнаружить, подключив прослушиватель mousemove к svg, а затем используя document.getElementFromPoint. getElementFromPoint Fiddle

Ни один из них не работает надежно, особенно если мышь движется быстро. Можно ли сделать одну из этих более чувствительных, чтобы лучше обнаружить наведение? Или, может быть, лучший способ сделать это?

ответ

2

Как работают браузеры, вы не получаете mouseover событий непрерывно, но получаете их каждый раз, когда операционная система обновляет позицию курсора. И если мышь движется быстро, вы получите события на несколько пикселей друг от друга. Мышь не слайд над документом, оно прыгает. Here's a jsfiddle показывает, где происходит каждое событие. Нет ничего, что можно сделать, чтобы получить mouseover событий для всех элементов между двумя последовательными позициями курсора.

Вы можете сделать что-то другое: помните предыдущее местоположение события mousemove, вычислите линию между этой точкой и текущей позицией мыши и вычислите все пересечения между этой линией и всеми другими фигурами в документе. Но это будет ресурсоемким, так как для этого нет API, вам придется самостоятельно вычислять перекрестки. Существует library, который может вам помочь.

+0

http://www.w3.org/TR/SVG11/struct.html#__svg__SVGSVGElement__getIntersectionList - это SVG DOM API для получения всех элементов, которые пересекают данный прямоугольник (который в этом случае будет линией перемещения мыши). –

+0

Правильно, но есть две проблемы: проверка всего прямоугольника между двумя точками, а не только строка, но это не так плохо; другой - это [он еще не реализован в Firefox] (https://bugzilla.mozilla.org/show_bug.cgi?id=501421) –

+0

Последний из них касается меня, я просто проверил свое решение, используя предложение @Eriks , и он не работает в Firefox – mikew