16

我正在尝试从子窗口调用父级中定义的 javascript 函数。我有两个这样的文件:

家长:

<html>
<head>
<title>Test</title>
<script type="text/javascript">
function foo () {
alert ("Hello from parent!");
}
function doStuff () {
var w = window.open("testa.html");
}
</script>
</head>
<body>
<input type="button" value="open" onClick="doStuff();" />
</body>
</html>

和孩子:

<html>
<head>
<title>Test A</title>
<script type="text/javascript">
function get() {
window.opener.foo();
}
</script>
</head>
<body>
<input type="button" value="Call Parent" onClick="get();" />
</body>
</html>

在我的一生中,我不能从子进程中调用函数 foo 。我认为 window.opener 对象应该可以做到这一点,但我似乎无法做到这一点。有什么建议么?

4

2 回答 2

17

确保您通过 http:// 访问它,这样同源策略就会通过,您可以从孩子访问 opener。如果您只使用 file://,它将无法正常工作。

于 2012-05-14T22:25:23.293 回答
1

回答拉胡尔的问题:

每个浏览器都可以从服务器或本地文件系统加载页面。要从本地文件系统加载文件,您应该将这样的地址放入浏览器file://[path],其中 [path] 是文件系统中文件的绝对路径(包括 Windows 上的驱动器号,请参阅http://blogs.msdn.com/b/即/archive/2006/12/06/file-uris-in-windows.aspx了解详细信息)。

要从本地 HTTP 服务器(如果有的话)加载文件,您应该使用类似这样的地址http://localhost:[port]/[path],其中 [port] 是您的服务器正在运行的端口(默认为 80),而 [path] 是文件的相对路径到服务器的文档根文件夹。文档根文件夹取决于服务器配置。

因此,如您所见,同一个本地文件可以通过两种方式加载到浏览器中。然而,这两种方式之间存在很大差异。在第一种情况下,浏览器不使用 HTTP 协议来加载文件,因此缺少许多不同机制正常工作所必需的东西。例如 AJAX 不适用于本地文件,因为 HTTP 响应状态不是 200 等。

在这个特定的示例中,浏览器安全机制没有获取原始信息,并阻止访问父窗口。

于 2015-09-03T15:43:55.157 回答