使用window.opener的问题

时间:2009-05-14 12:53:31

标签: javascript html ajax

我有一个简单的ajax应用程序

从此开始,弹出一个带有表单的弹出窗口。

表单结构页和ajax应用程序都有一个共同的javascript文件。

从弹出窗口,在表单结果页面中,我试图从常用的javascript文件中调用一个方法,以应用于父窗口。

我的javascript文件包含一个updateLayer方法,当父窗口中的caleld正常工作时。尝试从弹出窗口调用它时我什么都没得到。

弹出窗口中的结果页面有

<script type="text/javascript" src="x.js">window.opener.updateLayer("Layer3", "380118179930"); </script>
在任何HTML之前

父窗口中没有任何操作。我也尝试过window.parent。

这是什么原因和解决方案?

6 个答案:

答案 0 :(得分:3)

我认为这与this question有关,另一位用户也提到了这个名字也被称为Josh。

在我对这个问题的回答中,我试图解释父窗口中包含的Javascript文件中的函数是否会附加到窗口对象,因此您使用window.opener来访问该窗口对象以调用它们

看起来你几乎已经解决了这个问题,但问题在于,通过在表单响应的脚本标记中包含src="x.js",您可以有效地覆盖脚本中的任何代码。另外,由于x.js包含在父窗口中,所以无论如何都不需要在弹出窗口中显示它。

表单响应的代码应如下所示:

<script type="text/javascript">
window.opener.updateLayer("Layer3", "380118179930");
</script>

我删除了src="x.js"属性,否则会阻止执行<script></script>代码之间的代码。

答案 1 :(得分:0)

您的问题可能是您有两个具有相同内容的JavaScript文件,而没有应用任何名称空间。

首先,您的父级包含file.js,其中定义了updateLayer()。然后父进程打开子窗口,该窗口还包含该file.js.如果你这样做,你就有两个线程在运行,其中每个线程都有自己的功能和对象,而不会打扰另一个。我假设你的功能是全局的。如果没有使用名称空间,这可能会导致问题。另外,你的大型ajax库可以创建iframe和类似的东西,而且你不会看到任何东西,因为它发生在幕后。

所以尝试:top.window.opener.updateLayer(“Layer3”,“380118179930”);

如果这没有用,请尝试打开一个没有包含file.js的空白窗口,并从开启器中调用该函数。如果可行,请将该文件的内容包装在名称空间中,如myNamespace = {....大文件内容在...之间....},制作两个版本(或更好地动态包含内容)并确保你有两个不同的命名空间JavaScript通常不会按您认为的那样工作。

此外,请确保您打开的窗口的网址完全相同的域。它可能导致安全问题,因此浏览器不允许从子窗口访问它的父窗口。

答案 2 :(得分:0)

乔希,

你能否确定该函数是否被触发,如annakata建议的那样?例如。在函数的第一行放一个警告框?

否则:updateLayer中的函数x.js如何定义?

如果定义如下:

function updateLayer(layer, result) {
  // ...
}

......那么它应该可以正常工作。

如果定义如下:

var updateLayer = function(layer, result) {
  // ...
}

然后可用作window对象的属性(因此也不能用作window.opener的属性)。在Firefox中,至少;我没有在IE或其他浏览器中测试过这个。

编辑:为什么这个问题标记为'ajax'? AFAICS,所有问题都存在于应用程序的客户端;没有ajax参与。

答案 3 :(得分:0)

请尝试以下操作:

parent.window.updateLayer();

在单独的<script>标记中。

我不太确定它是否同时适用于src = some.js和内联脚本。

答案 4 :(得分:-1)

由于您已为脚本元素指定了src属性,因此x.js的结果将被解析为JS,并且将忽略该元素的文本内容。

<script type="text/javascript" src="x.js"></script>
<script type="text/javascript">
    window.opener.updateLayer("Layer3", "380118179930");
</script>

答案 5 :(得分:-3)

在您的父html文件中创建一个新的updateLayer函数。重命名它并从中调用原始的updateLayer。 e.g。

function updateLayerPage(arg1, arg2)
{
    updateLayer(arg1, arg2);
}

然后从子页面调用此新函数

window.opener.updateLayerPage("Layer3", "380118179930");