Как я определяю местоположение элемента в SVG в Opera, учитывая координаты?
elementFromPoint (x, y) хорошо работает с Firefox, но, кажется, перестал работать с Opera, возвращая всегда целый SVG а не конкретный элемент.
Можно было бы задаться вопросом, почему мне нужен он вообще. Ну, просто потому что я хотел бы выделить элемент SVG под курсором, и потому что Opera не запускает события, когда элемент под курсором добавляется/удаляется перед созданием перемещения с мышью. Таким образом, когда я добавляю новый элемент, он не выделяется, прежде чем я перемещу мышь немного, которая не выглядит хорошей.
С наилучшими пожеланиями, Mikhail.
В Opera есть SVG1.1 SVGSVGElement.getIntersectionList .
var element= document.elementFromPoint(pageX, pageY);
if (element.localName.toLowerCase()=='svg' && 'getIntersectionList' in element) {
var svgxy= Element_getPageXY(svg); // by the usual offsetLeft/offsetParent etc. method
var rect= svg.createSVGRect();
rect.x= pageX-svgxy[0];
rect.y= pageY-svgxy[1];
rect.width=rect.height= 1;
var hits= svg.getIntersectionList(rect, null);
if (hits.length>0)
element= hits[hits.length-1];
}
[Непроверенный код, может даже работать.]
Способ делать то, что вы хотите, без необходимости самостоятельно искать элемент под курсором, продемонстрирован в этом примере . По сути, вы привязываете обработчик событий для события наведения указателя мыши к элементу корневого документа, а затем проверяете цель события, чтобы выяснить, какой элемент фактически получил событие.
Для производственного кода вы должны добавить логику, чтобы позаботиться о ситуациях, когда элемент является ссылкой
(с помощью target.correspondingUseElement, чтобы узнать идентификатор).