Javascript window.onunload отключается после Page_Load - PullRequest
2 голосов
/ 02 марта 2010

Я заметил, что событие window.onunload запускается после события AFTER page_load, которое не имеет смысла.

Такое поведение создает для меня проблему - при разгрузке я очищаю сеанс, поэтому, если Page_Load сначала ДО загрузки, появляются ошибки на отображаемой странице.

Я ожидаю, что javascript onunload будет запускаться ДО Page_Load .... это правильное предположение?

УТОЧНИТЬ: Давайте предположим, что я нахожусь на странице test.aspx, затем я нажимаю на ссылку, которая ведет на ту же страницу (скажем, я нажимаю на меню), я вижу, что сначала запускается Page_Load, а затем запускается onunload. Не имеет никакого смысла.

Ответы [ 6 ]

1 голос
/ 16 декабря 2010

Это поведение браузера. Chrome и FF отправят запрос GET ДО запуска onunload, IE8 сначала выполнит onunload. Не уверен, как другой браузер справится с этим. Лучше не полагаться на эту функциональность.

1 голос
/ 02 марта 2010

Рассматривали ли вы использование общего базового класса для своих страниц и очистку сеанса там, если запрос не является обратной передачей (я предполагаю, что вы используете сеанс для обратных передач)?

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.
}
0 голосов
/ 15 марта 2010

Похоже, вы используете сеанс для сохранения временных переменных, которые меняются от страницы к странице. Я бы сказал, что сессия не совсем подходит для такого сценария. Лучшим решением было бы использовать коллекцию Item Httpcontext, которая ограничена только для каждого запроса. Он работает так же, как Session при хранении данных.

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

Поскольку это только для отдельных запросов, нет необходимости использовать javascript для очистки элементов, которые вы сохранили при каждом запросе страницы.

0 голосов
/ 02 марта 2010

Вы можете написать служебную функцию, которая будет обрабатывать удаление переменных сеанса, а затем вызывать эту функцию в соответствующих событиях щелчка меню. Это должно быть проще в использовании, так как разгрузка окна будет запускаться только после загрузки страницы.

0 голосов
/ 02 марта 2010

Событие onunload срабатывает до того, как запрос новой страницы отправляется на сервер, поэтому оно обязательно срабатывает до запуска метода Page_Load на сервере.

Скорее всего, проблемачто вы отправляете на сервер еще один запрос из события onunload.Поскольку IIS обрабатывает только один запрос от каждого пользователя за раз, этот запрос будет поставлен в очередь и будет выполнен после запроса на новую страницу.

0 голосов
/ 02 марта 2010

Я бы предположил , что window.unload на самом деле запускается только тогда, когда вам нужно будет ОТКАЗАТЬ новую страницу, на которую вы перешли (иначе старый DOM сносится вместо нового HTML ). Браузер не знает, что отображать, пока ответ не вернется с сервера с HTML-кодом для отображения. Этот HTML не генерируется, пока не завершится жизненный цикл страницы, включая Page_Load. Следовательно, page_load перед window.unload?

В любом случае, если вы можете очистить сеанс во время window.unload, почему бы просто не очистить его в ответ на какое-либо взаимодействие с пользователем и быть более откровенным об этом?

Редактировать : Не могли бы вы также попробовать window.onbeforeunload?

...