在我们(相当大和旧)的ASP.NET应用程序中,我们使用大量页面加载到框架,iframe和模态对话框中(使用window.showModalDialog)。我们开始看到上面的错误,我似乎无法在任何地方找到一个合理的解释。
弹出窗口阻止程序。不。我们没有运行它们。甚至不是内置拦截器。
受信任的区域。不。该应用程序现在在LocalHost上运行,它位于可信站点列表中。
迷路宇宙射线。可能,但不太可能。这太过一致了。
我 最终在some dusty tome中找到了隐藏在Microsoft网站上的有关检索自动化错误消息信息的错误消息。在其中,他们谈论的是Excel,他们说:“在这个例子中,Microsoft Excel是服务器应用程序。一旦销毁(或关闭)工作簿对象,就会生成错误。”< / p>
如果没有真正具体的解释,这可能就像我对错误原因的解释一样接近。 有人试图在引用它之后使用某些东西。奇怪的是,你仍然可以看到屏幕上的窗口。然而,奇怪的是,这让我怀疑this已接受的答案。
所以这就是发生的事情。
如果有人可以告诉我为什么会这样(代码在FF中运行),我会很感激。
答案 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问题的具体例子。