【问题标题】:Javascript window.onunload fires off after Page_LoadJavascript window.onunload 在 Page_Load 之后触发
【发布时间】:2010-12-16 20:22:30
【问题描述】:

我注意到 window.onunload 事件在 page_load 事件之后触发,这是没有意义的。

这种行为给我带来了问题 - 在我的 unonload 中,我清除了会话,因此如果 Page_Load 先于 onunload,则显示的页面上有错误。

我希望 javascript onunload 在 Page_Load 之前触发......这是正确的假设吗?

澄清: 假设我在页面 test.aspx 上,然后单击指向同一页面的链接(例如单击菜单),我观察到 Page_Load 首先触发,然后 onunload 触发。 一点意义都没有。

【问题讨论】:

  • 这个问题没有多大意义,因为它目前的措辞。为什么您希望页面在加载之前先卸载?
  • 有什么特殊原因要清除用户onunload事件的会话。

标签: asp.net pageload window.onunload


【解决方案1】:

这是特定于浏览器的行为。 Chrome 和 FF 将在 onunload 被触发之前发送一个 GET 请求,IE8 将首先执行 onunload。不确定,其他浏览器如何处理它。最好不要依赖这个功能。

【讨论】:

    【解决方案2】:

    您是否考虑过为您的页面使用公共基类,并在请求不是回发时清除其中的会话(我假设您正在使用会话进行回发)?

    public class BasePage : System.Web.UI.WebControls.Page {
      protected override OnPreInit (EventArgs e) {
        // Get in nice and early, however you could use OnInit if you prefer
        if (!Page.IsPostBack) {
          Session.Clear();
        }          
    }
    

    那么你需要清除会话的页面可以声明为:

    public class SpecialPage : BasePage {
      // Your page logic goes here.
      // Note that if you need to do work in OnPreInit here you should call
      // base.OnPreInit(e) first.
    }
    

    【讨论】:

      【解决方案3】:

      我会 window.unload 实际上只有在您必须渲染导航到的新页面时才会触发(也就是旧的 DOM 正在被拆除以代替一些新的HTML)。浏览器不知道要呈现什么,直到响应从服务器返回并显示 HTML。在页面生命周期完成之前不会生成该 HTML,其中包括 Page_Load。因此 window.unload 之前的 page_load?

      无论如何,如果您可以在 window.unload 期间清除会话,为什么不直接清除它以响应某些用户交互并更明确一点呢?

      编辑:你也可以试试 window.onbeforeunload 吗?

      【讨论】:

      • 问题是我无法控制用户。用户可以选择点击他们想要的任何地方。因此,如果他们单击菜单,我希望 window.onunload 将首先触发,清除会话,然后 page_load 将触发。不是这样。
      • 我编辑了我的答案 - window.onbeforeunload 对您的事业有帮助吗?
      • 谢谢,但 onbeforeunload 实际上会产生更多问题 - 它会弹出程序员无法手动访问的对话框。我不想弹出对话框,我只想清除会话,然后加载新页面。 Arggg,显然要求太多了。
      【解决方案4】:

      onunload 事件确实会在新页面的请求被发送到服务器之前触发,因此它肯定会在Page_Load 方法在服务器上运行之前触发。

      问题很可能是您正在从onunload 事件向服务器发送另一个请求。由于 IIS 一次只处理来自每个用户的一个请求,因此该请求将在新页面的请求之后排队并执行。

      【讨论】:

      • 我在onunload里面注释掉了对服务器的请求,在Page_Load里面放了断点。尽管如此,Page_Load 首先执行,然后从 window.unonload 发出警报......什么给出了? window.unonload 事件有什么意义,那么如果它在新页面加载后执行。
      • 有没有办法在加载新页面之前真正清除会话?我完全迷失和沮丧。
      • @guffa - 我刚刚写了一个小测试应用程序,我认为 onunload 在请求服务器之前不会触发。我自己也很怀疑——但测试应用不会说谎。
      【解决方案5】:

      您可以编写一个实用函数来处理会话变量的删除,然后在相应的菜单单击事件中调用该函数。这应该更易于使用,因为仅在页面加载后才会触发窗口卸载。

      【讨论】:

        【解决方案6】:

        听起来您正在使用 Session 来保存因页面而异的临时变量。我会说 Session 并不适合这种场景。更好的解决方案是使用 Httpcontext 的 Item 集合,它的范围仅基于每个请求。存储数据时,它的工作原理与 Session 相同。

        Context.Items["myvariable"] = "some data";
        

        由于它仅针对每个请求进行限定,因此无需使用 javascript 来清除您在每个页面请求中存储的项目。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2018-11-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-06-27
          相关资源
          最近更新 更多