2

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

这种行为给我带来了一个问题 - 在我的卸载中我清除了会话,所以如果 Page_Load 首先在卸载之前,显示的页面上有错误。

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

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

4

6 回答 6

2

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

于 2010-12-16T12:22:30.240 回答
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.
}
于 2010-03-02T11:32:54.990 回答
0

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

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

于 2010-03-02T00:45:07.047 回答
0

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

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

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

于 2010-03-15T18:15:41.260 回答
0

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

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

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

于 2010-03-02T00:17:07.810 回答
0

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

于 2010-03-02T10:03:15.870 回答