JS:“被调用者(服务器[不是服务器应用程序])不可用并且消失了。”访问window.opener

时间:2010-10-01 14:23:40

标签: javascript asp.net internet-explorer

在我们(​​相当大和旧)的ASP.NET应用程序中,我们使用大量页面加载到框架,iframe和模态对话框中(使用window.showModalDialog)。我们开始看到上面的错误,我似乎无法在任何地方找到一个合理的解释。

  1. 弹出窗口阻止程序。不。我们没有运行它们。甚至不是内置拦截器。

  2. 受信任的区域。不。该应用程序现在在LocalHost上运行,它位于可信站点列表中。

  3. 迷路宇宙射线。可能,但不太可能。这太过一致了。

  4. 最终在some dusty tome中找到了隐藏在Microsoft网站上的有关检索自动化错误消息信息的错误消息。在其中,他们谈论的是Excel,他们说:“在这个例子中,Microsoft Excel是服务器应用程序。一旦销毁(或关闭)工作簿对象,就会生成错误。”< / p>

    如果没有真正具体的解释,这可能就像我对错误原因的解释一样接近。 有人试图在引用它之后使用某些东西。奇怪的是,你仍然可以看到屏幕上的窗口。然而,奇怪的是,这让我怀疑this已接受的答案。

    所以这就是发生的事情。

    • 第A页是主页。
    • PageA在一个框架中显示PageB。 PageB是一个工具栏。
    • PageA在另一个框架中显示PageC。这就是内容。
    • PageC在非模态对话框中显示PageD。
    • PageD,由于我不知道的原因,想要修改PageB中的控件。它试图使用window.opener来做到这一点,并且失败可怕。

    如果有人可以告诉我为什么会这样(代码在FF中运行),我会很感激。

4 个答案:

答案 0 :(得分:11)

虽然我的答案不能直接适用于这个特定的问题,但是如果您在沟通时遇到此错误(被调用者(服务器[非服务器应用程序])不可用并且消失; )在弹出窗口和开启窗口之间,这是因为弹出窗口创建了一个对象,然后将其传递给开启窗口。当弹出窗口关闭时,Internet Explorer会终止弹出窗口创建的所有对象。并且由于对象是通过引用传递的,因此开启窗口引用的对象现在已经消失。一个简单的解决方法是通过使用JSON.stringify将对象转换为JSON字符串来传递值。然后,您可以使用JSON.parse()将字符串转换回window.opener中的对象。

示例:

弹出窗口:

window.opener.callback(JSON.stringify({
    id: 1,
    name: "foo"
}));

开启窗口:

window.callback = function (response) {
    var foo = JSON.parse(response);
};

使用这种方法,开启窗口不再引用在弹出窗口中创建的对象,因此在弹出窗口关闭后,开启窗口中的对象将继续存在。

答案 1 :(得分:6)

我应该早点更新这个问题,并为延迟道歉。自从我发布以来,我学到了一点,这就是我所学到的。

对于使用window.showModalDialog打开的窗口,window.opener方法返回null,而不是对打开窗口的引用。要获得对打开窗口的引用,您必须将其作为对话框参数传递。

此时我不清楚这是否是预期的行为;这显然是无证件的行为。此外,根据MSDN,window.opener仅对加载到frame和iframe中的页面有效。

答案 2 :(得分:2)

我在以下场景中有完全相同的错误消息: 窗口A弹出风B,用户搜索东西和风B呼叫风A传递一些参数。 呼叫风的方法A假设在完成它正在做的事情之后关闭弹出风B. 我将参数作为对象传递: p = {a:1,b:“c”} 我重写代码后分别传递每个参数错误消失了。 callingMethod(1, “C”);

希望有人帮助......

答案 3 :(得分:0)

你可以在excel中得到这个错误

Sub LoadParameterForm()

If frmParm Is Nothing Then
    Set frmParm = New frm_setParameters
End If

frmParm.Show
end sub 

这里frmParm是一个模块级变量。 单击确定按钮,我打算.HIDE()表单,以便用户的选择是粘性的。 如果用户点击控制框X并关闭表单,那么你基本上让frmParm指向不再存在的东西。

我还没有找到测试条件的方法,我陷阱错误,将表单设置为空,然后再试一次。

我意识到这不是被问到的问题,但它是帖子中多次提到的相关excel问题的具体例子。