Для файлов SVG, включенных в HTML, контекст такой же, как для элементов HTML DOM - но когда вы используете ссылку на SVG в качестве отдельного документа, у вас есть доступ только к контексту этого документа.Чтобы получить доступ к элементу и событию, используйте onclick="test(this,event)"
(во вложенном или отдельном файле).
function short() {
document.querySelector('rect').setAttribute('height',100);
}
button {display: block}
<button id="msg" onclick="short()">Click on box and/or on this button</button>
<svg width="210" height="297" viewbox="0 0 210 297" xmlns="http://www.w3.org/2000/svg">
<script type="text/javascript"><![CDATA[
function test(rect,event) {
let w= +rect.getAttribute("width")
rect.setAttribute("width", w+10)
msg.innerText+=' #'
console.log({rect,event,document,window})
}
]]></script>
<rect x="10" y="20" width="100" height="200" style="fill:red" onclick="test(this,event)"></rect>
</svg>
В приведенном выше фрагменте - встроенный jv svg имеет доступ вне svg (изменить содержимое <div id="msg">
) - а также другие html-сценарии (вне svg)иметь доступ к SVG.Если svg включен как <img src="test.svg">
, то svg embeded js никогда не будет выполнен.Если svg включен как <object data="circle.svg" type="image/svg+xml">
, JS будет выполняться как отдельный документ, поэтому он не будет иметь доступа к <div id="msg">
, а также внешние html-скрипты имеют доступ только к объекту, но не имеют доступа к элементам svg.