svg是一个基于xml的图形,你可以添加JavaScripts。我试图访问svg中定义的脚本函数。我的svg中的脚本是这样的:
<svg ... onload="RunScript(evt);"...>
<script type="text/javascript">
...
function RunScript(loadEvent) {
// Get object in my html by id
var objElement = top.document.getElementById('objid1');
if (objElement)
{
// Extend object tag object's methods
objElement.SVGsetDimension = setDimension;
...
}
function setDimention(w, h) {...}
在我的主html文件中,svg嵌入在这样的对象标记中:
<object id="objid1" data="mygrahic.svg" ... >
<a href="#" onclick="document.getElementById('objid1').SVGsetDimention(10, 10);
return false;"
...>Set new dimention</a>...
这个工作正常。但是,如果svg xml文件由完整URL(在另一个站点上)引用,如下所示:
<object id="objid1" data="http://www.artlibrary.net/myaccount/mygrahic.svg" ... >
代码不再起作用。看起来我不能将我的svg脚本中定义的方法附加到我的主html对象标记元素中的方法,或者在这种情况下顶部或文档不可用,或者getElementById(..)只是找不到我的对象元素我的svg脚本。有什么方法可以在svg xml脚本中找到我的html元素吗?
不确定此问题是否是由不同的DOM引起的,并且我的svg脚本代码无法找出另一个DOM的对象或元素。如果有任何解决方案,那就太好了。
答案 0 :(得分:4)
我认为线索可能在“另一个网站上”。关于何时允许来自不同站点的JavaScript程序与其他站点进行通信有严格的规定。嵌入式SVG的处理方式与iframe
内的文档相同。
答案 1 :(得分:2)
所以,从浏览器的角度来看,你所做的是等同于以下内容:
<script>
function stealPassword() {
var passwordInput = document.querySelector('input[type="password"]');
var value = passwordInput.value; // My password!
sendPasswordToServerToStealMyMoney(value);
}
</script>
<iframe src=mybank.com onload=stealPassword()></iframe>
我想你会理解为什么这不可取。 (但是,错误控制台中可能会出现警告或异常。)
答案 2 :(得分:1)
pdc有这个权利。浏览器努力防止跨站点脚本攻击(XSS),这就是结果。您无法在从其他域加载的文档中执行脚本,也无法使用其他端口或协议。有关详细信息,请参阅:http://en.wikipedia.org/wiki/Same_origin_policy
答案 3 :(得分:0)
从我的经历; 你的代码是真的,所以完全运行。 我的电脑Windows 7,IE9,安装了Adobe Viewer。 除非SVG Viewer,IE9 SVG绘制,但无法运行SVG TAG动画, 只能运行Javascript动画。 因此,在Windows XP,IE8下,安装了Adobe SVG Viewer,结果相同(完全运行)。
Firefox SVG无法在我的电脑下运行(SVG ecmascript动画)。