繁体   English   中英

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

[英]Call a JavaScript function defined in an iframe in Chrome using the file protocol

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

我有一个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 - 它有愚蠢的安全概念。”

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

当然没有办法:)这些文件协议是由用户明确调用的。 正如您所见,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

因此,请使用以下命令打开Chrome:chrome.exe --allow-file-access-from-files ,用于开发。

感谢@Mohamed Mansour提供的信息,我能够找到有关此问题的更多详细信息。

Chrome行为的基本原理是防止恶意制作的网页通过JavaScript和内部框架在您不知情的情况下访问您的文件系统内容并将数据上传到互联网[ Chromium bug 4197Chromium bug 47416 ]。

从我的观点来看,Chromium团队选择尽可能地采取行动是不幸的。 Gecko在攻击这个痣方面有点微妙:它将跨页脚本限制为同一子目录[ Mozilla bug 230606文件协议的同源策略 ]。 对于用户和开发人员而言,结果并没有那么令人惊讶,并且产生了比Chrome的行为更多的焦虑 - 阅读Chromium bug 47416 ,特别是看看我的意思。

由于这种行为,我不得不修改我的“网站” - 它不能托管在互联网上并且必须驻留在本地用户的机器上 - 因此它会抛出一个对话框,告诉用户切换浏览器。 这真的太糟糕了 - 我想支持Chrome,但是只要他们想要运行我的“网站”,就不能指望我的用户用一个模糊的命令行选项重新启动它。

我在这里发布我的调查结果以防其他人在我的问题中偶然发现Chrome似乎神秘地不适合他们,并鼓励任何读这篇文章的人考虑主演Chromium bug 47416 开发人员已经明确表示,他们不愿意考虑改变Chrome的行为,除非人们真正关心这个问题。 被告知“我必须告诉用户不要使用Chrome”并没有得到足够的鼓励。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM