У меня есть документ SVG, в котором я использовал javascript для реализации функций масштабирования и панорамирования [адаптировано из библиотеки SVGPan Андреа Леофредди]. Сам SVG имеет элемент привязки, который должен запускать отдельный URL. Моя проблема в том, что, поскольку событие onclick было захвачено для масштабирования и панорамирования, href на якоре не достигнут. Как я могу изолировать якорь от ловушки onclick?
В приведенном ниже коде, когда я нажимаю на текст «Кухонная раковина», я хотел бы запустить прикрепленный к нему URL-адрес, а не входить в режим масштабирования и панорамирования:
Фрагменты кода:
SVGLib.js:
...
setupHandlers(root);
function setupHandlers(root){
setAttributes(root, {
"onclick" : "handleClick(evt)"
});
root.addEventListener('DOMMouseScroll', handleMouseWheel, false);
}
function handleClick(evt) {
if(evt.preventDefault)
evt.preventDefault();
evt.returnValue = false;
var svgDoc = evt.target.ownerDocument;
var g = getRoot(svgDoc);
// Get the click location
// If key button clicked with shift key down, reset
if (evt.shiftKey == 1) {
setCTM(g, root.createSVGMatrix());
shiftX = initShiftX;
shiftY = initShiftY;
}
else {
var ctm = g.getCTM();
var ctmInv = ctm.inverse();
var newctm = g.getCTM();
// showMatrix('before: ', newctm);
shiftX = shiftX - (evt.clientX - initShiftX);
shiftY = shiftY - (evt.clientY - initShiftY);
newctm.e = shiftX * vbCTMInv.a;
newctm.f = shiftY * vbCTMInv.d;
// bring in the scale factors from the vbCTMInv -- because scaling will apply automatically via the vb transform
newctm.a = newctm.a*vbCTMInv.a;
newctm.d = newctm.d*vbCTMInv.d;
// showMatrix('after: ', newctm);
setCTM(g, newctm);
}
}
doc.html:
<html>
...
<svg>
...
<g id="g33" style="fill: none; stroke: green">
<a xlink:href="/cgi-bin/qbui/drive.pl?sqlHandle=693F1DB6-6C7F-11E1-8475-31DDD99CA768">
<text id="t2769800058" style="text-anchor: middle; font-family: Verdana; font-size: 10px" x="600" y="1300">Kitchen Sink</text>
</a>
</g>
...
</svg>
</html>
Обновление:
Я нашел обходной путь, который я могу использовать, чтобы определить цель события и предпринять соответствующие действия. Id - это идентификатор текстового элемента SVG, если щелкнуть «Kitchen Sink». Конечно, это требует некоторых изменений в коде, но это выполнимо.
В handleClick ():
if (evt.target.id == ...) {
...
}