使用文件协议调用Chrome中iframe中定义的JavaScript函数

M. *_*llo 3 html javascript iframe google-chrome file-uri

这个问题非常类似于这里提出的问题的完全更新版本:如何使用文件协议在Chrome/Webkit中将JavaScript函数从一个帧调用到另一个帧 - 遗憾的是,这个问题从未真正回答过.

我有一个HTML页面,其中包含iframe中的SVG图像.SVG导出一个JavaScript API,允许它执行有用的操作(重置为缩放和居中,以"实际大小"显示).在iframe下面,我将用户可以点击该按钮的按钮放到SVG中定义的功能中.

我的代码看起来像这样:

function reset() {
  document.getElementByID('iframe').contentWindow.reset();
}
Run Code Online (Sandbox Code Playgroud)

它在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 - 它有愚蠢的安全概念."

有没有办法解决这个限制?

Moh*_*our 5

当然没有办法:)这些文件协议是由用户明确调用的.正如您所见,Web应用程序绝对没有办法允许这样做.

唯一的方法是,如果您"作为用户"允许发生这种情况,如果是这样,您可以通过添加以下命令行参数来启用它:

// By default, file:// URIs cannot read other file:// URIs. This is an
// override for developers who need the old behavior for testing.
--allow-file-access-from-files
Run Code Online (Sandbox Code Playgroud)

因此,打开Chrome:chrome.exe --allow-file-access-from-files,用于开发.