这个问题与这里提出的问题的完全更新版本非常相似:How to call a JavaScript function from one frame to another in Chrome/Webkit with file protocol - 不幸的是,这个问题从未真正得到回答。
我有一个在 iframe 中包含 SVG 图像的 HTML 页面。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——它有愚蠢的安全概念。”
有没有办法解决这个限制?