Bezdepbonusu7Программирование: статьи и ответы

Вопрос

В чем разница между ASP.NET AJAX pageLoad() и JavaScript window.onload?

Автор вопроса: CommunityОтветов: 1

Я работаю с ASP.NET AJAX и хочу понять разницу между этими двумя фрагментами:

function pageLoad(sender, eventArgs) { }

и

window.onload = function() { }
  • Они действуют одинаково?
  • Или один вызывается перед другим?
  • Или один вызовется автоматически, а другой нет?

javascript

Ответы

Ответ 1 · рейтинг 41 · Crescent Fresh

Пара вещей, которые следует отметить в первую очередь. MS изобрела своего рода "клиентский объект времени выполнения" под названием Sys.Application. . Он обрабатывает события init, load и unload на протяжении всего [клиентского] жизненного цикла страницы следующим образом:

  1. Sys.Application.initialize() начинает init часть жизненного цикла. Это initialize() всех элементов управления AJAX на стороне клиента, после чего они готовы к программному взаимодействию.
  2. Sys.Application начинает load часть жизненного цикла, вызывая все обработчики, подписавшиеся на это событие.
  3. Наконец, он вызывает глобальную функцию pageLoad (если она определена)

Шаги 2) и 3) повторяются для каждой частичной (т. е. AJAX + UpdatePanel) обратной передачи.

Итак, наконец, ответ: pageLoad - это просто удобный ярлык для Sys.Application.add_load().

Однако что касается его отношения к window.onload, все становится интереснее. По сути, MS требовалось, чтобы window.onload сработало только после завершения фазы init. Но вы не можете контролировать, когда браузер сработает onload, так как он привязан к "загруженному содержимому". Это известно как "проблема window.onload":

Событие onload срабатывает после загрузки всего содержимого страницы (включая изображения и другой двоичный контент). Если на вашей странице много изображений, вы можете увидеть заметную задержку перед тем, как страница станет активной.

Итак, они просто изобрели свою собственную "специальную" функцию, которая срабатывает в нужное время в жизненном цикле события, и назвали ее "pageLoad". И трюк, который они использовали для запуска этого пользовательского жизненного цикла события, заключался в том, чтобы поместить вызов Sys.Application.initialize() непосредственно перед закрывающим тегом </form>. Серверная среда выполнения делает это. Проницательные читатели заметят, что этот трюк позволил MS решить проблему window.onload, поскольку любой код, который вы поместите в pageLoad, будет срабатывать независимо от двоичного содержимого (с одним редким уловом для IE).

› Они действуют одинаково?

Концептуально да, на практике вовсе нет из-за упомянутой проблемы window.onload. Единственное правило заключается в том, что код, взаимодействующий с вашими элементами управления AJAX, следует помещать только в pageLoad, поскольку window.onload следует своей собственной траектории событий.

› Или один вызывается перед другим?

Они полностью, на 100% независимы.

› Или один будет вызываться автоматически, а другой нет?

Они оба будут вызываться, если вы их определили.

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы