所以我使用onbeforeunload事件来关闭从父窗口打开的所有子窗口(图像)。我正在使用的代码是旧的,父窗口为不同的操作做了很多回发,所以我在跟踪服务器端的图像,并在需要时将onbeforeunload属性添加到正文中。
当要关闭窗口时,服务器端代码会编写一个脚本,该脚本只需使用字符串参数调用Javascript函数。 Javascript工作正常,问题是它并不总是被击中。
我的服务器端代码如下所示:
private void CloseAllChildren()
{
// some code to retrieve image window names...
string script = "closeAllChildren('imagewindowname1,imagewindowname2,etc');";
_body.Attributes.Add("onbeforeunload", script);
}
触发关闭事件时调用的close方法:
private void Close()
{
// A bunch of code...
// close the window after all folders have been routed
CloseAllChildren();
this.Response.Write(FolderView.WindowClose);
}
我对计算机一无所知是随机的,但我的结果似乎没有遵循任何形式。有时它会碰到Javascript并且运行得很好,有时它在相同的测试条件下永远不会碰到Javascript。我假设存在某种竞争条件,但我不确定如何检测或修复它。有没有人有这方面的经验或更好的方法呢?就像我说的,代码是旧的,这是功能的一个小补充,所以我不想改变任何当前的框架。
提前致谢。
答案 0 :(得分:1)
在javascript onbeforeunload事件触发后,很可能发生了服务器端关闭事件。为什么有条件地将javascript函数调用添加到body标签中?为什么不总是在javascript中添加处理程序:
window.onbeforeunload = closeAllChildren('imagewindowname1,imagewindowname2,etc');
无论服务器在做什么,都会调用closeAllChildren。
答案 1 :(得分:0)
在尝试了上面的建议和我自己的一些想法之后,问题似乎是javacript在添加onbeforeunload属性之前最终会执行window.top.close()
命令(因为它是动态编写的),类似于我的预期。我通过将window.top.close()
更改为setTimeout(function() {window.top.close();}, 100)
添加了半秒的超时时间,它似乎修复了我遇到的“随机性”。
我很感激帮助,而我最终没有使用其他解决方案,他们帮助我找到了真正的问题。