Найдите элемент в SVG в Opera по координатам - PullRequest
5 голосов
/ 14 февраля 2010

Как мне найти элемент в SVG в Opera, учитывая координаты?

elementFromPoint (x, y) отлично работает с Firefox, но, похоже, не работает с Opera, возвращая всегда весь SVG, а не конкретный элемент.

Можно задаться вопросом, зачем мне это вообще нужно. Ну, просто потому, что я хотел бы выделить элемент SVG под курсором, а также потому, что Opera не запускает никаких событий, когда элемент под курсором добавляется / удаляется, прежде чем вы сделаете ход с помощью мыши. То есть, когда я добавляю новый элемент, он не подсвечивается, прежде чем слегка двигать мышь, что выглядит не очень хорошо.

Ура, Михаил.

Ответы [ 2 ]

5 голосов
/ 14 февраля 2010

В 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];
}

[Непроверенный код, может даже работать.]

0 голосов
/ 14 июля 2010

Способ сделать то, что вы хотите, без необходимости искать элемент под курсором, демонстрируется в этом примере . По сути, вы привязываете обработчик события mouseover к корневому элементу документа, а затем проверяете цель события, чтобы выяснить, какой элемент фактически получил событие.

Для производственного кода вы должны добавить логику, чтобы позаботиться о ситуациях, когда элемент является ссылкой <use> (с помощью target.correspondingUseElement, чтобы узнать идентификатор).

...