如何从svg访问html对象标记中的javascript函数

如何从svg访问html对象标记中的javascript函数,javascript,jquery,html,svg,Javascript,Jquery,Html,Svg,我使用了我看到的另一个svg的onload,但不知道它到底做了什么。 我得到一个错误,说测试不是一个函数。 我尝试将onclick=“test()”更改为window.objectID.functionName,如“window.mySvg.test()”等其他SO答案中所述,但得到了“无法读取未定义的属性测试”。如果这是不可能的,那么当从svg中单击某个内容时,使jquery中的对话框出现(如sweetalertjs)的最佳方式是什么? 谢谢 HTML 演示 浏览器无法呈现Svg var e

我使用了我看到的另一个svg的onload,但不知道它到底做了什么。 我得到一个错误,说测试不是一个函数。 我尝试将onclick=“test()”更改为window.objectID.functionName,如“window.mySvg.test()”等其他SO答案中所述,但得到了“无法读取未定义的属性测试”。如果这是不可能的,那么当从svg中单击某个内容时,使jquery中的对话框出现(如sweetalertjs)的最佳方式是什么? 谢谢

HTML

演示
浏览器无法呈现Svg
var embed=document.getElementById(“mySvg”);
embed.addEventListener('load',function())
{
var svg=embed.getSVGDocument();
功能测试()
{
console.log(“被访问的函数”);
}
});
SVG
这里肯定搞错了,但是如果其他人遇到类似的情况,那是因为测试函数是在另一个函数中定义的。将test()函数移出eventListener,但仍在脚本标记中,这样我就可以通过添加top从svg的onclick事件访问它。父母亲test()前面的window.parent或window.top,例如“window.parent.test()”

HTML

演示
浏览器无法呈现Svg
var embed=document.getElementById(“mySvg”);
embed.addEventListener('load',function())
{
var svg=embed.getSVGDocument();
});
功能测试()
{
console.log(“被访问的函数”);
}
SVG



您已经在函数中定义了
测试
;它只在那个函数中可见。@DaveNewton不知道为什么我花了这么长时间才意识到。。我认为embed.addEventListener的工作方式是svg可以访问其中的任何内容,但事实并非如此!我将该函数移到该函数和EventListener之外,并能够通过parent.test()top.test()或window.parent.test()window.top.test()访问它,谢谢!没问题:)。
<div class="container-fluid">
  <h1>Demo</h1>
  <object id="mySvg" data="{{ url_for('static', filename='images/test.svg') }}" type="image/svg+xml">
  Browser could not render Svg
</object>
<script>
var embed = document.getElementById("mySvg");
embed.addEventListener('load', function()
{
    var svg = embed.getSVGDocument();
    function test()
    {
        console.log("accessed function");
    }
});
</script>
</div>
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg id="svg1394" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" onload="var src; if (document.documentURI) src = document.documentURI; else if (this.getSrc) src = this.getSrc(); else src = document.location.href + ''; try {parent.preload.load(src);}catch(e) {}" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" height="800" sodipodi:version="0.32" width="1280" inkscape:export-xdpi="120" version="1.0" inkscape:output_extension="org.inkscape.output.svg.inkscape" inkscape:export-ydpi="120" xmlns:cc="http://creativecommons.org/ns#" xmlns:xlink="http://www.w3.org/1999/xlink"  xmlns:dc="http://purl.org/dc/elements/1.1/">
<rect id="rect1" height="70" width="20" stroke="#000" y="355.6" x="307.7" stroke-width=".8833" fill="#C0C0C0" onclick="test()"/>
</svg>
<div class="container-fluid">
  <h1>Demo</h1>
  <object id="mySvg" data="{{ url_for('static', filename='images/test.svg') }}" type="image/svg+xml">
  Browser could not render Svg
</object>
<script>
var embed = document.getElementById("mySvg");
embed.addEventListener('load', function()
{
    var svg = embed.getSVGDocument();
});
function test()
    {
        console.log("accessed function");
    }
</script>
</div>
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg id="svg1394" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" onload="var src; if (document.documentURI) src = document.documentURI; else if (this.getSrc) src = this.getSrc(); else src = document.location.href + ''; try {parent.preload.load(src);}catch(e) {}" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" height="800" sodipodi:version="0.32" width="1280" inkscape:export-xdpi="120" version="1.0" inkscape:output_extension="org.inkscape.output.svg.inkscape" inkscape:export-ydpi="120" xmlns:cc="http://creativecommons.org/ns#" xmlns:xlink="http://www.w3.org/1999/xlink"  xmlns:dc="http://purl.org/dc/elements/1.1/">
<rect id="rect1" height="70" width="20" stroke="#000" y="355.6" x="307.7" stroke-width=".8833" fill="#C0C0C0" onclick="top.test()"/>
</svg>