JavaScript中如何调用父窗口的函数?

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对象应该是可能的,但我似乎不能让它起作用。有什么建议吗?


5
你是通过 http:// 还是 file:/// 访问这些页面的? file 协议没有来源,因此你将始终无法通过 同源策略 ,导致无法访问 opener - Jonathan Lonowski
原来问题在于我只是通过file://访问它们。当我将它们放入http://目录中时,它就可以正常工作了。 - RPIBuckHunter
什么是http://和file:///? 如何从一个更改为另一个?我也有同样的问题,请帮忙。 - Rahul Khandelwal
@RahulKhandelwal 你可能是在本地计算机上访问你的页面,而没有运行像apache/nginx [例如 - 在Windows中使用xampp]这样的服务器。因此,仅通过双击打开页面将使用“file:///”协议在浏览器中打开它,而不是“http://”。 - DeadLock
2个回答

17

请确保您通过http://访问此网页,这样同源策略就会生效,并且您可以从子网页中访问opener对象。如果您仅使用file://方式,则无法正常工作。


1

回答Rahul的问题:

每个浏览器都可以从服务器或本地文件系统加载页面。要从本地文件系统加载文件,您应该向浏览器提供类似于file://[path]的地址,其中[path]是文件在文件系统中的绝对路径(包括Windows上的驱动器号码,请参见http://blogs.msdn.com/b/ie/archive/2006/12/06/file-uris-in-windows.aspx了解详情)。

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

因此,正如您所看到的,同一个本地文件可以通过两种方式加载到浏览器中。然而,这两种方式之间有很大的区别。在第一种情况下,浏览器不使用HTTP协议来加载文件,因此缺少许多必要的机制来使不同的机制正常工作。例如,AJAX无法与本地文件一起使用,因为HTTP响应状态不是200等。在这个特定的例子中,浏览器安全机制没有获取源信息,并防止访问父窗口。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接