这个问题与此处提出的问题的完全更新版本非常相似:如何使用文件协议在 Chrome/Webkit 中从一帧调用 JavaScript 函数到另一帧 https://stackoverflow.com/questions/2570718/how-to-call-a-javascript-function-from-one-frame-to-another-in-chrome-webkit-with——不幸的是,这个问题从未得到真正的回答。
我有一个 HTML 页面,其中包含 iframe 中的 SVG 图像。 SVG 导出一个 JavaScript API,允许它执行有用的操作(重置为缩放和居中,以“实际大小”显示)。在 iframe 下方,我放置了按钮,用户可以单击该按钮来调用 SVG 中定义的函数。
我的代码如下所示:
function reset() {
document.getElementByID('iframe').contentWindow.reset();
}
它在 Safari、Firefox 甚至 IE 9(支持 SVG - 万岁!)中完美运行。但在 Chrome 上,它失败了:调试器告诉我:
Property 'reset' of object [object DOMWindow] is not a function
.
事实上,这似乎确实是事实:尽管“contentWindow”是 DOMWindow 类型,但它没有方法或字段(至少调试器不会向我显示)。即使询问其“文档”字段也会失败(返回 null)。
问题似乎是使用 file:// 协议来传输包含的 HTML 和包含的 SVG。正如我在上面提到的问题中所指出的,当尝试访问“contentWindow”时,Chrome 会产生以下错误:
Attempt to access frame with URL file://[...]/contained.svg from frame with URL file://[...]/container.html. Domains, protocols and ports must match.
总的来说,我认为安全性很好;这看起来像是一个出于安全考虑的限制。但在这里,它似乎走得太远了:毕竟,这些是用户文件系统上的文件,就我而言,甚至位于同一目录中。
托管代码不是一种选择 - 它必须驻留在用户的计算机上。我不想告诉人们“只是不要使用 Chrome - 它有愚蠢的安全概念。”
有没有办法解决这个限制?