【问题标题】:Unreliable results using onbeforeunload使用 onbeforeunload 的结果不可靠
【发布时间】:2012-03-26 14:58:46
【问题描述】:

所以我使用 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);
}

以及触发关闭事件时调用的关闭方法:

private void Close()
{
     // A bunch of code...

     // close the window after all folders have been routed
     CloseAllChildren();
     this.Response.Write(FolderView.WindowClose);
}

我不知道计算机是随机的,但我的结果似乎没有遵循任何模式。有时它会命中 Javascript 并完美运行,有时它在相同的测试条件下永远不会命中 Javascript。我假设存在某种竞争条件,但我不确定如何检测或修复它。有没有人有这方面的经验或更好的方法?就像我说的,代码很旧,这是对功能的一个小补充,所以我不想更改任何当前框架。

提前致谢。

【问题讨论】:

  • 您应该发布 JavaScript 端的事件处理程序的样子......哦等等;我猜你确实发布了那个。但是那个“closeAllChildren”函数呢?这是什么样的(JavaScript 版本,而不是创建对其调用的服务器端代码)。
  • Javascript 只是根据窗口名称关闭被告知的窗口,'function closeAllChildren(names) { if (names != "") { var opensWindows = names.split(',' ); while (openedWindows.length > 0) { var winName = opensWindows.pop(); var win = window.open(winName, winName);赢.close(); } } }' 这不是问题,如果这个方法被命中,它不会失败。我的问题在于它并不总是受到打击。
  • 另外,我对在这里发帖还很陌生,我真的不知道如何在评论中添加代码块。

标签: c# javascript asp.net onbeforeunload


【解决方案1】:

很可能您的服务器端关闭事件是在 javascript onbeforeunload 事件触发之后发生的。为什么你有条件地将javascript函数调用添加到你的body标签?为什么不总是在你的 javascript 中添加处理程序:

window.onbeforeunload = closeAllChildren('imagewindowname1,imagewindowname2,etc');

然后无论服务器在做什么都会调用 closeAllChildren。

【讨论】:

  • 父页面导致太多回发,所以如果我总是处理它,窗口会在不应该关闭的时候关闭。我还需要根据存储在服务器端的名称添加参数,我输入的参数只是一个示例。
  • @MGraffia Page.IsPostBack
  • 我不确定我是否理解这有什么帮助。我理解 onbeforeunload 的方式是它在页面卸载之前触发,在回发的情况下,它将在我能够使用 Page.IsPostBack 捕获任何内容之前触发。如果我错了请纠正我,但是检查是否有回发似乎无法解决这个问题。
  • @MGraffia 我想我明白你在做什么。而不是在服务器端关闭事件期间将一些 javascript 附加到 onbeforeunload 事件,如果您只是直接注入 javascript 调用呢?
  • 如何使用 Response.Write 来做到这一点?
【解决方案2】:

在尝试了上面的建议和我自己的一些想法之后,问题似乎是 javacript 最终会在添加 onbeforeunload 属性之前执行window.top.close() 命令(因为它是动态编写的),这是相似的达到我的预期。我通过将 window.top.close() 更改为 setTimeout(function() {window.top.close();}, 100) 添加了半秒的超时,它似乎已经修复了我遇到的“随机性”。

感谢您的帮助,虽然我最终没有使用其他解决方案,但它们帮助我找到了真正的问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-01-14
    • 2017-11-12
    • 2011-02-07
    • 1970-01-01
    • 1970-01-01
    • 2016-07-24
    • 2015-05-11
    • 2016-05-08
    相关资源
    最近更新 更多