如何使用文件协议在 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.domainname
与 domainname
)?相同的协议(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
标签上给出 rows
或 cols
,否则 IE 只会加载一帧。 (如果我问的话,validator 会告诉我的。)
【讨论】:
非常感谢您;请查看我对问题的编辑:实际上我在使用 Chrome 时遇到的问题仅在使用文件协议时出现(而不是在通过 http 的网络服务器提供文件时)。以上是关于如何使用文件协议在 Chrome/Webkit 中从一帧调用 JavaScript 函数的主要内容,如果未能解决你的问题,请参考以下文章
在 Chrome webkit 检查器中不断生成“不安全的 JavaScript 尝试使用 URL 访问框架...”错误
Chrome(webkit)中浮动元素中的用户文本选择选择更多文本[关闭]