Подтвердить что ты не робот

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

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

function pageLoad(sender, eventArgs) { }

и

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

Ответ 1

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

  • Sys.Application.initialize() начинает init часть жизненного цикла. Это initialize() все клиентские AJAX-элементы управления, после чего они готовы к взаимодействию с программным обеспечением
  • Sys.Application начинает load часть жизненного цикла, вызывая все обработчики, подписавшиеся на это событие
  • Наконец, он вызывает глобальную функцию 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>. Среда serverside делает это. Астуальные читатели заметят, что этот трюк позволил MS решить проблему window.onload, так как любой код, который вы помещаете в pageLoad, будет запускаться независимо от двоичного содержимого (w/один редкий улов для IE).

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

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

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

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

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

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