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

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

function pageLoad(sender, eventArgs) { }

и

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

person Community    schedule 02.03.2009    source источник


Ответы (1)


Пара вещей, которые следует отметить в первую очередь. 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% независимы.

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

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

person Crescent Fresh    schedule 02.03.2009
comment
ваш ответ завершен, но у меня есть еще одна проблема с pageLoad, когда я вставил свою страницу, я обнаружил, что она продолжает вызываться и вызываться автоматически, примечание: у меня есть telerik:RadAjaxManager на странице, так что это из-за ошибки или ее нормально продолжать вызывать так, как это вызывается таймером? - person Amr Elgarhy; 02.03.2009
comment
хорошая запись +1 - решение ‹/form› очень смехотворно, Microsoft - person annakata; 02.03.2009
comment
@amrelgarhy: см. мой обновленный ответ: шаги 2) и 3) вызываются при каждой частичной (т.е. AJAX + UpdatePanel) обратной передаче. - person Crescent Fresh; 02.03.2009
comment
@crescentfresh: +1. Почему вы удалили свой другой ответ? Это более или менее то же самое. выглядит смущенным - person Tomalak; 03.03.2009
comment
@annakata Это решение (звонки непосредственно перед закрывающим тегом </form>) на самом деле гениальное. Это позволило отделить жизненный цикл страницы ASP от ужасных событий, зависящих от браузера. Это также причина, по которой теперь так легко создать, например, полный API оповещений на стороне сервера, который использует чистый javascript для отображения/скрытия или анимации и т. д. определенных элементов. Они проделали фантастическую работу с этим, и благодаря этому мы можем выполнять любой код JS, который захотим, из событий на стороне сервера. ♥ х100 - person Skipper; 21.08.2018