访问svg的脚本

时间:2008-10-29 17:01:33

标签: javascript html svg

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的对象或元素。如果有任何解决方案,那就太好了。

4 个答案:

答案 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动画)。