使用onbeforeunload的结果不可靠

时间:2012-03-26 14:58:46

标签: c# javascript asp.net onbeforeunload

所以我使用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。我假设存在某种竞争条件,但我不确定如何检测或修复它。有没有人有这方面的经验或更好的方法呢?就像我说的,代码是旧的,这是功能的一个小补充,所以我不想改变任何当前的框架。

提前致谢。

2 个答案:

答案 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)添加了半秒的超时时间,它似乎修复了我遇到的“随机性”。

我很感激帮助,而我最终没有使用其他解决方案,他们帮助我找到了真正的问题。