Я немного озадачен тем, когда происходит событие window.onload. Например: у меня есть страница с множеством внешних js-файлов и даже загрузкой скрипта по требованию (динамическое создание тега). Весь этот код находится на странице (т. Е. Он не срабатывает при щелчке или чтении, он должен выполняться при загрузке). Теперь давайте скажем, что у меня есть window.onload = somefunction () в последнем JavaScript по требованию. Возможно ли это окно? onload сработает до того, как все скрипты будут загружены?
window.onload
(он же body.onload
) запускается после того, как основной HTML, все CSS, все изображения и все другие ресурсы были загружены и отрисованы. Поэтому, если ваши изображения задерживаются, это может занять некоторое время.
Если вам нужен только HTML (DOM), вы можете использовать jQuery $(document).ready()
- он сработает, когда HTML будет разобран, но до того, как браузер закончит загрузку всех внешних ресурсов (изображений и таблиц стилей, которые идут после вашего элемента скрипта в HTML).
Сценарии, встроенные в страницу, выполняются, когда браузер разбирает каждого из них. Поэтому, чтобы выполнить сценарий перед любым другим сценарием, добавьте тег
в заголовок сразу после
.
Это означает, что вы можете "эмулировать" window.onload
, добавив тег в качестве последнего элемента
.
Нет. window.onload () вызывается, когда все ресурсы (документ, объекты, изображения, CSS и т. Д.) Завершили рендеринг.
Неправильно прочитали вопрос. Да, вполне возможно, что событие window.onload сработает до завершения загрузки динамически добавляемого скрипта. Сценарии, добавленные с использованием DOM ( document.createElement () ), загружаются асинхронно и не подчиняются обычному правилу, согласно которому window.onload () сначала ожидает завершения загрузки всех ресурсов.
Я установил для вас набор тестов, http://jsfiddle.net/ywSMW/ .Этот сценарий динамически добавляет сценарий jQuery в DOM и записывает значение $
в консоль во время обработчика onload . Затем он снова записывает значение через секунду. Даже если скрипт кэшируется, первая запись в консоль возвращает undefined , что означает, что загрузка даже сработала до того, как скрипт jQuery был загружен и проанализирован.
Проверено в IE и Chrome.
var windowHasLoaded = false;
window.onload = function () {
windowHasLoaded = true;
}
function doSomethingWhenWindowHasLoaded() {
if (!windowHasLoaded) {
// onload event hasn't fired yet, wait 100ms and check again
window.setTimeout(doSomethingWhenWindowHasLoaded, 100);
} else {
// onload event has already fired, so we can continue
}
}