Javascript 使用window.opener时出现的问题

Javascript 使用window.opener时出现的问题,javascript,html,ajax,Javascript,Html,Ajax,我有一个简单的ajax应用程序 由此,将启动一个带有表单的弹出窗口 表单结果页和ajax应用程序都有一个共同的javascript文件 在弹出窗口的resultpage表单中,我试图从公共javascript文件调用一个方法,以应用于父窗口 我的javascript文件包含一个updateLayer方法,当从父窗口调用时,该方法可以正常工作。当我试图从弹出窗口调用它时,什么也没有得到 弹出窗口中的resultpage已关闭 <script type="text/javascript" sr

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

由此,将启动一个带有表单的弹出窗口

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

在弹出窗口的resultpage表单中,我试图从公共javascript文件调用一个方法,以应用于父窗口

我的javascript文件包含一个updateLayer方法,当从父窗口调用时,该方法可以正常工作。当我试图从弹出窗口调用它时,什么也没有得到

弹出窗口中的resultpage已关闭

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

parentwindow中没有发生任何事件。我也试过window.parent


原因和解决方案是什么?

在父html文件中创建一个新的updateLayer函数。将其重命名为其他名称并从中调用原始updateLayer。 e、 g

然后从子页面调用这个新函数

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

由于您为script元素提供了src属性,因此x.js的结果将被解析为js,元素的文本内容将被忽略

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

window.opener.updateLayer(“Layer3”、“380118179930”);

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

首先,您的父级包含定义updateLayer()的文件.js。然后父窗口打开子窗口,其中也包括file.js。如果您这样做,您将运行两个线程,其中每个线程可能都有自己的函数和对象,而不会影响其他线程。我假设你的函数是全局的。如果不使用名称空间,这可能会导致问题。此外,您的大型ajax库可能会创建iFrame之类的东西,而您不会从中看到任何东西,因为它发生在后台

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

如果这没有帮助,请尝试打开一个没有包含file.js的空白窗口,并从打开器中调用该函数。如果可以的话,将file.js的内容包装在一个名称空间中,比如myNamespace={….big file content inbetween….},制作两个版本的文件(或者更好地动态包含内容),并确保有两个不同的名称空间。JavaScript通常没有按照您认为应该的方式工作

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

Josh

你能确定这个函数是否像annakata建议的那样被触发吗?例如,在功能的第一行放置一个警报框

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

如果定义如下:

function updateLayer(layer, result) {
  // ...
}
<script type="text/javascript">
window.opener.updateLayer("Layer3", "380118179930");
</script>
…那么它应该可以正常工作

如果定义如下:

var updateLayer = function(layer, result) {
  // ...
}
然后它将不能作为
window
对象的属性使用(因此也不能作为
window.opener
的属性使用)。至少在Firefox中;我还没有在IE或其他浏览器中测试过


编辑:为什么这个问题被标记为“ajax”?AFAICS,所有问题都存在于应用程序的客户端;不涉及ajax。

我认为这与另一个用户的请求有关,该用户碰巧也叫Josh

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

看起来您几乎解决了这个问题,但这里的问题是,通过在表单响应的脚本标记中包含
src=“x.js”
,您实际上覆盖了脚本中的所有代码。另外,由于x.js包含在父窗口中,因此无论如何,根本不需要在弹出窗口中包含它

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

function updateLayer(layer, result) {
  // ...
}
<script type="text/javascript">
window.opener.updateLayer("Layer3", "380118179930");
</script>

window.opener.updateLayer(“Layer3”、“380118179930”);
我已删除
src=“x.js”
属性,否则将阻止执行
标记之间的代码。

请尝试以下操作:

parent.window.updateLayer();
在单独的
标记中


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

有没有办法避免这种情况?这个函数依赖于其他几个函数……我看不出这有什么理由可以实现任何功能。如果您可以访问updateLayer页面,则可以访问updateLayer,间接操作不会添加任何内容。我正在更新您所评论的答案。应该是-假设使用正确的参数调用updateLayer函数,并且在opener窗口中正确定义了updateLayer函数。嗯,仍然没有运气。你是说updateLayer必须在x.js之外的ajax应用程序和弹出窗口中声明吗?如果是这样的话,这是不可能的,因为它依赖于太多的其他功能…不。updateLayer只需要是一个可以从加载到opener窗口的文档运行的函数(AFAIK也是首先打开窗口的页面(后面没有链接)。+1如果不是问题的话,这绝对是一个问题。@Josh:你需要证明该方法正在被调用(对于初学者,只需在其顶部放置一个警报),如果不是,则需要证明该方法是可访问的“警报(typeof(window.opener.updateLayer))”继续向后工作,在前进的过程中为我们提供更多信息。Firebug将极大地帮助您。David Dorwards的答案肯定是解决方案的一部分-您不能将src和innertext与脚本混合。没错。不要混合。最好在标题中包含x.js。非常感谢您的帮助。您好,是的,我尝试了s Tobias建议,它运行良好。我同时使用了x.js和window.parent,这导致它失败。