如何使用文件协议在 Chrome/Webkit 中从一帧调用 JavaScript 函数

Posted

技术标签:

【中文标题】如何使用文件协议在 Chrome/Webkit 中从一帧调用 JavaScript 函数【英文标题】:How to call a JavaScript function from one frame to another in Chrome/Webkit with file protocol 【发布时间】:2011-02-03 23:17:50 【问题描述】:

我开发了一个应用程序,它在一帧中包含项目列表;当单击一个项目时,它会在另一个框架中执行某些操作(加载图像)。

这在所有浏览器中都可以正常工作,包括 Chrome 3;现在它在 Firefox 中仍然可以正常工作,但在最新版本的 Chrome 中(我相信自 4 以来)它会引发此错误:

不安全的 javascript 尝试从带有 URL (...) 的框架访问带有 URL (...) 的框架。 域、协议和端口必须匹配。

这显然是一个安全“功能”,但有可能绕过它吗?

这是一个简单的测试:

index.html:

<html>
  <frameset cols="50%,50%">
    <frame src="left.html" name="left"/>
    <frame src="right.html" name="right"/>
    </frameset>
  </html>

left.html:

<html>
  <body>
    <a href="javascript:parent.right.test('hello');">click me</a>
    </body>
  </html>

right.html:

<html>
  <body>
    <script>
      function test(msg) 
        alert(msg);
        
      </script>
    </body>
  </html>

以上内容在 Firefox 3.6 和 Chrome 3 中有效,但在 Chrome 5 中会引发上述错误...

编辑

将@cols 属性添加到框架集元素 事实上,当且仅当页面使用 http 协议(并且来自同一个域)提供时,它才能在 Chrome 中工作,但 我的问题是当页面是本地的并通过 file:// 协议提供时强>。然后它适用于 Firefox(所有版本)和 Chrome 3,但不适用于 Chrome 5(我没有 Chrome 4,所以我不知道那个特定版本(也不知道是否可以下载特定的 Chrome 版本) ?) -- 但对于 Chrome 5,我很确定它不起作用)。

【问题讨论】:

如果所有页面都在同一个域上,这应该可以正常工作。您是否 100% 确定它是同一个域(甚至不是 www.domainnamedomainname)?相同的协议(http/https)? 实际上问题是特定于文件协议的;当文件通过 http 和同一个域提供时,Chrome 没有问题;但在 file:// Chrome 5 上会抛出上述错误。这个应用程序的全部意义在于不需要用户进行任何安装,他们应该能够直接浏览 CD-Rom 上的文件(不要问!;-) 所以如果文件协议被破坏,那就是一个问题.. . 任何帮助将不胜感激! 【参考方案1】:

查看密切相关问题的答案:Call a JavaScript function defined in an iframe in Chrome using the file protocol。

简而言之,使用 --allow-file-access-from-files 启动 Chrome 会“解决”问题,因为不会报告错误。

当然,由于您是在 CD 上分发文件,因此您不太可能认为这是一个实际的解决方案。我建议主演 Chromium bug 47416 以鼓励 Chromium 的开发者让 Chrome 更符合 Gecko 的行为。

【讨论】:

【参考方案2】:

我尝试了您的测试页面,它们在 Windows 上的 Chrome 4.1.249.1045(以及 Firefox 3.6.3 和 IE7 [修复以下问题后])上运行良好。所以我支持 Pekka(和往常一样):我认为问题一定出在其他地方。

它在 IE7 中不起作用,我花了很长时间才弄清楚为什么不起作用:您需要在 frameset 标签上给出 rowscols,否则 IE 只会加载一帧。 (如果我问的话,validator 会告诉我的。)

【讨论】:

非常感谢您;请查看我对问题的编辑:实际上我在使用 Chrome 时遇到的问题仅在使用文件协议时出现(而不是在通过 http 的网络服务器提供文件时)。

以上是关于如何使用文件协议在 Chrome/Webkit 中从一帧调用 JavaScript 函数的主要内容,如果未能解决你的问题,请参考以下文章

在 Chrome webkit 检查器中不断生成“不安全的 JavaScript 尝试使用 URL 访问框架...”错误

在 Chrome/WebKit/Safari 中禁用锚点

Chrome/Webkit 音频标签错误?

Chrome(webkit)中浮动元素中的用户文本选择选择更多文本[关闭]

使用 Chrome/WebKit 调试 Access-Control-Allow-Origin

从 Chrome/Webkit 中的 <select> 元素中删除圆角