Javascript window.onunload在Page_Load之后触发

时间:2010-03-02 00:00:18

标签: asp.net pageload window.onunload

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

这种行为给我带来了一个问题 - 在我的unonload中我清除了会话,所以如果Page_Load首先进行onunload,那么页面上就会出现错误。

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

要澄清: 让我们假设我在页面test.aspx上,然后点击进入同一页面的链接(比如我点击菜单),我观察到的是Page_Load首先触发,然后onunload触发。 完全没有意义。

6 个答案:

答案 0 :(得分:1)

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

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.
}

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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

在任何情况下,如果你可以在window.unload期间清除会话,为什么不只是为了响应某些用户交互而清除它并且更明确一些呢?

修改:您还可以尝试使用window.onbeforeunload吗?

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

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

答案 5 :(得分:0)

听起来您正在使用Session来保存在页面之间发生变化的临时变量。我会说会话并不适合这种情况。更好的解决方案是使用Httpcontext的Item集合,该集合的范围仅基于每个请求。它在存储数据时与Session相同。

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

由于它仅限于每个请求的范围,因此无需使用javascript清除您在每个页面请求中存储的项目。