Як виконати функцію, коли сторінка повністю завантажена?


306

Мені потрібно виконати деякий код JavaScript, коли сторінка повністю завантажена. Сюди входять такі речі, як зображення.

Я знаю, ви можете перевірити, чи DOM готовий, але я не знаю, чи це те саме, що коли сторінка повністю завантажена.


7
Отже, як перевірити, чи DOM готовий?
Mads Skjern

Відповіді:


441

Так називається load. Він прийшов Waaaaay до того, як DOM готовий був навколо, і DOM Ready був фактично створений з точної причини, яка loadчекала на зображення.

window.addEventListener('load', function () {
  alert("It's loaded!")
})

3
тож, просто для уточнення (якщо я можу), порівнюючи з DOM готовим, window.onloadвикликається, коли кожен компонент сторінки / ресурс (тобто * включаючи * зображення). Маю рацію?
BreakPhreak

19
@BreakPhreak: так :) onloadчекає всіх ресурсів, що входять до документа. Це, звичайно, виключає запити, створені динамічно, які не є частиною самого документа, наприклад, запит AJAX.
Матвій

3
сценарій завантажений не повністю
HD ..

Що робити, якщо мій скрипт може бути динамічно завантажений і подія "завантаження" відбулася до того, як я додав обробник?
pamelus

31
Кращим способом було б addEventListener("load", function(){})замість того, щоб перезаписати onloadмайно.
user4642212

30

Зазвичай ви можете користуватися window.onload, але ви можете помітити, що останні веб-переглядачі не спрацьовують, window.onloadколи ви використовуєте кнопки історії назад / вперед.

Деякі люди пропонують дивні викривлення для вирішення цієї проблеми, але насправді, якщо ви просто зробите window.onunloadобробник (навіть той, який нічого не робить), ця кешування буде відключена у всіх браузерах. MDC документи цієї «особливість» дуже добре, але з якоїсь - то причини все ще є люди , які використовують setIntervalі інше дивне хакі.

Деякі версії Opera мають помилку, яку можна вирішити, додавши наступне десь на вашу сторінку:

<script>history.navigationMode = 'compatible';</script>

Якщо ви просто намагаєтесь отримати функцію javascript, яку називають один раз за перегляд (і не обов'язково після закінчення завантаження DOM), ви можете зробити щось подібне:

<img src="javascript:location.href='javascript:yourFunction();';">

Наприклад, я використовую цей трюк для завантаження дуже великого файлу в кеш на завантажувальному екрані:

<img src="bigfile"
onload="this.location.href='javascript:location.href=\'javascript:doredir();\';';doredir();">

Хтось може уточнити, як працює цей трюк ? Занадто складно для мене, да? ..
Раззл

20

Для повноти ви можете також прив’язати його до DOMContentLoaded, який зараз широко підтримується

document.addEventListener("DOMContentLoaded", function(event){
  // your code here
});

Більше інформації: https://developer.mozilla.org/en-US/docs/Web/Events/DOMContentLoaded


7
Ця відповідь якраз протилежна тому, що було задано у питанні.
Мухаммед бен Юсрат

2
Дійсно, подія DOMContentLoaded запускається, коли весь вміст DOM завантажений, перш ніж він завантажив усі його залежності. Оскільки користувачі в нитці відповідей на які $.readyя посилався, я вважав, що це зробив хороший внесок. Btw. Я б використовував addEventListener-метод також для loadподії, оскільки він дозволяє мати декілька зворотних зворотних window.addEventListener("load", function(event){ // your code here });
дзвінків

16

Спробуйте це лише запустити після завантаження цілої сторінки

За допомогою JavaScript

window.onload = function(){
    // code goes here
};

За Jquery

$(window).bind("load", function() {
    // code goes here
});

1
$(window)змушує мене думати, що це буде jquery - правда? Або я заплутав синтаксис javascript? (Я новачок у JS).
Azendale

2
чому б просто не використовувати, $(document).ready();коли jQuery доступний?
Андреас

ваш - це документ (більш-менш просто проаналізований HTML), інший ("завантажувати") - це все, включаючи зображення та стилі. Залежить від того, що вам потрібно.
аментес

11

Спробуйте цей код

document.onreadystatechange = function () {
  if (document.readyState == "interactive") {
    initApplication();
  }
}

відвідайте https://developer.mozilla.org/en-US/docs/DOM/document.readyState для отримання більш детальної інформації


Так, це корисно. Велике спасибі ~
Bravo Yeung

2
"interactive"не завантажений повністю. "complete"повністю завантажений
Райан Уокер

Нарешті! Дякую мільйон, Якобе. Усі численні методи, перераховані тут, зазнали невдач (у кращому випадку радіо-кнопка буде оновлена, і в результаті розрахунок можна було б зробити, але кнопка не з’явилася натиснутою), ваш метод робить свою справу.
сек

8

подія window.onload запуститься, коли все завантажено, включаючи зображення тощо.

Ви хочете перевірити стан готовості до DOM, якщо ви хочете, щоб ваш js-код був виконаний якомога раніше, але вам все одно потрібно отримати доступ до елементів DOM.


8

Javascript, що використовує onLoad()подію, буде чекати завантаження сторінки перед виконанням.

<body onload="somecode();" >

Якщо ви використовуєте функцію готовості документа jQuery Framework, код завантажується, як тільки DOM буде завантажений і перед завантаженням вмісту сторінки:

$(document).ready(function() {
    // jQuery code goes here
});

7

Ви можете скористатися window.onload , оскільки документи вказують, що він не запускається, поки не буде готовий домен і не буде завантажено ВСІ інші активи на сторінці (зображення тощо).


Ах геніальний. Ну я зробив це. Останнє зображення на сторінці таке: <img src = "imdbupdate.php? Update = ajax" style = "display: hidden" onload = "window.location = 'movies.php? Do = admincp'" /> Однак це не читає мене
Бен Шелок

...що? Ви хочете переадресувати, коли завантажується зображення?
Мачу

Я не впевнений, чому ви цього хочете, але причиною того, що він не переспрямовує, може бути те, що його відображається: приховано, і, отже, браузер не намагається завантажувати його, оскільки він не відображатиметься.
Мачу

можливо, це просто приховане зображення, яке робить щось важливе на сервері, наприклад відстеження звернення чи щось у БД?
Марк Новаковський,

Я можу це отримати, але перенаправляти його після мене не має сенсу. Навіщо взагалі мати сторінку, якщо ви не хочете, щоб користувач витрачав на неї час? І якщо мета - перенаправлення на завантаження, чому б не просто використати подію window.onload, оскільки це загально чистіша реалізація?
Мачу


2

У сучасних браузерах із сучасним JavaScript (> = 2015) ви можете додати type="module"тег сценарію, і все, що знаходиться всередині цього сценарію, буде виконано після завантаження цілої сторінки. наприклад:

<script type="module">
  alert("runs after") // Whole page loads before this line execute
</script>
<script>
  alert("runs before")
</script>

також старі браузери зрозуміють nomoduleатрибут. Щось на зразок цього:

<script nomodule>
  alert("tuns after")
</script>

Для отримання додаткової інформації ви можете відвідати javascript.info .


1

Якщо вам потрібно використовувати багато onloadвикористовувати $(window).loadзамість (Jquery):

$(window).load(function() {
    //code
});

1

OnLoad властивість Mixin GlobalEventHandlers є обробником події для події навантаження в вікні, XMLHttpRequest, елемент і т.д., який спрацьовує , коли ресурс завантажений.

Таким чином, у JavaScript вже є метод завантаження у вікні, який виконується, яку сторінку завантажують повністю, включаючи зображення ...

Ви можете щось зробити:

var spinner = true;

window.onload = function() {
  //whatever you like to do now, for example hide the spinner in this case
  spinner = false;
};

-1

Оновлення 2019 року: це відповідь, яка працювала на мене. Оскільки мені знадобилося кілька запитів ajax, щоб спочатку повернути та повернути дані для підрахунку елементів списку.

$(document).ajaxComplete(function(){
       alert("Everything is ready now!");
});
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.