在我们的(相当大和旧的)ASP.NET 应用程序中,我们使用大量加载到框架、iframe 和模式对话框(使用 window.showModalDialog)中的页面。我们开始看到上面的错误,我似乎无法在任何地方找到一个合理的解释。
弹出窗口拦截器。没有。我们没有运行它们。甚至内置拦截器也不行。
可信区域。没有。该应用程序现在在 LocalHost 上运行,并且在受信任的站点列表中。
杂散宇宙射线。可能,但不太可能。这太一致了。
我确实最终在 some dusty tome 中找到了隐藏在 Microsoft 网站上的错误消息关于检索自动化错误消息信息。在其中,他们在谈论 Excel,他们说:“在这个例子中,Microsoft Excel 是服务器应用程序。在工作簿对象被销毁(或关闭)后引用它会产生错误。”
这可能是我对错误原因的最接近解释,没有真正具体的解释。 有人在对某个东西的引用被处理后试图使用它。 奇怪的是,您仍然可以在屏幕上看到这些窗口。然而,奇怪的是,这让我对 this 的公认答案感到怀疑。 .
这就是发生的事情。
- 页面 A 是主页。
- PageA 在框架中显示 PageB。 PageB 是一个工具栏。
- PageA 在另一个框架中显示 PageC。这就是内容。
- PageC 在非模态对话框中显示 PageD。
- PageD,出于我不知道的原因,想要修改 PageB 中的控件。它试图使用 window.opener 来做到这一点,但失败得很厉害。
如果有人能告诉我为什么会这样(代码在 FF 中有效),我将不胜感激。
最佳答案
虽然我的回答并不直接适用于这个特定问题,但如果您在通信时遇到此错误(被调用者(服务器 [非服务器应用程序])不可用并消失;)在弹出窗口和开启窗口之间,这是因为弹出窗口创建了一个对象,然后将其传递给开启窗口。当弹出窗口关闭时,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);
};
使用这种方法,opener window 不再引用在弹出窗口中创建的对象,因此 opener window 中的对象将在弹出窗口关闭后继续存在。
关于javascript - JS : "The callee (server [not server application]) is not available and disappeared." accessing window. 开瓶器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3840066/