Чем отличается ASP.NET AJAX pageLoad () от JavaScript window.onload? - PullRequest
17 голосов
/ 02 марта 2009

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

function pageLoad(sender, eventArgs) { }

и

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

1 Ответ

41 голосов
/ 02 марта 2009

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

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

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

...