Определить, завершена ли загрузка страницы

93

Есть ли способ определить, когда страница завершила загрузку, то есть все ее содержимое, javascript и активы, такие как CSS и изображения?

так нравится:

if(PAGE HAS FINISHED LOADING)
{
// do something amazing
}

а также дополнительно, если страница загружалась более 1 минуты, сделайте что-нибудь еще, например:

if(PAGE HAS BEEN LOADING FOR 1 MIN)
{
// do something else amazing
}

Я видел, как веб-сайты, такие как MobileMe от Apple, выполняли аналогичные проверки, но не мог понять это в своих огромных библиотеках кода.

Кто-нибудь может помочь?

Благодарность

РЕДАКТИРОВАТЬ: Это, по сути, то, что я хочу сделать:

// hide content
$("#hide").hide();

// hide loading
$("#loading").hide();

// fade in loading animation
setTimeout($('#loading').fadeIn(), 200);

jQuery(window).load(function() {
  $("#hide").fadeIn();

  $("#loading").fadeOut(function() {
    $(this).remove();
    clearInterval(loadingAnim);
  });

  setTimeout(function() {
    $("#error").fadeIn();
  }, 60000);
});
Кэмерон
источник
2
Есть ли причина, по которой window.onload(или $(window).load()) не работает?
sdleihssirhc
Привет, @Cameron. Какой код работает, чтобы скрыть загрузчик после завершения загрузки страницы?
tnkh 08
@TonyNg См. Мой ответ: stackoverflow.com/questions/7083693/…
Кэмерон

Ответы:

129
jQuery(window).load(function () {
    alert('page is loaded');

    setTimeout(function () {
        alert('page is loaded and 1 minute has passed');   
    }, 60000);

});

Или http://jsfiddle.net/tangibleJ/fLLrs/1/

См. Также http://api.jquery.com/load-event/ для объяснения jQuery (window) .load.

Обновить

Подробное объяснение того, как работает загрузка javascript и два события DOMContentLoaded и OnLoad, можно найти на этой странице .

DOMContentLoaded : когда DOM готов к манипулированию. Способ jQuery захвата этого события - с помощью jQuery(document).ready(function () {});.

OnLoad : когда модель DOM готова и все ресурсы, включая изображения, iframe, шрифты и т. Д. , Загружены, а класс «Вращающееся колесо / час» исчезает. Способ jQuery захвата этого события описан выше jQuery(window).load.

Т. Юнгханс
источник
Если вы посмотрите на мой ОП, я изменил его, чтобы он показал, каковы мои цели. Итак, по сути, я хочу показать страницу после того, как все ресурсы загружены, а затем исчезнет загрузчик и исчезнет контент. Будет ли мой код работать правильно? Cheers
Кэмерон
Ваш код выглядит неплохо, но мне нужно увидеть его в действии, чтобы убедиться.
T. Junghans
@Jimmer Да: MDN : «Событие загрузки запускается, когда ресурс и его зависимые ресурсы завершили загрузку».
T. Junghans
2
Обратите внимание, что jQuery.load()это устарело с jQuery / 1.8 и удалено в jQuery / 3. Текущий синтаксис jQuery(window).on("load", function(){/*...*/});.
Álvaro González,
59

в jquery есть два способа сделать это в зависимости от того, что вы ищете.

используя jquery, вы можете сделать

  • // это будет ждать загрузки текстовых ресурсов перед вызовом this (dom .. css .. js)

    $(document).ready(function(){...});
    
  • // это будет ждать завершения загрузки всех изображений и текстовых ресурсов перед выполнением

    $(window).load(function(){...});
    
Samccone
источник
Как с помощью этого метода узнать, загружалась ли страница несколько минут, но еще не завершена?
yoozer8
2
это можно сделать с помощью setTimeout (function () {! loaded && foo ();}, 20000); и установите для параметра loaded значение true в готовом документе или загрузке окна
samccone
1
для jquery 3.0 используйте $ (window) .on ("load", function (e) {});
zero8
13

Это называется onload. Готовность к модели DOM была фактически создана по той причине, по которой onload ожидал изображений. (Ответ, полученный от Матчу на аналогичный вопрос некоторое время назад.)

window.onload = function () { alert("It's loaded!") }

onload ожидает всех ресурсов, которые являются частью документа.

Ссылка на вопрос, где он все объяснил:

Нажми меня, ты знаешь, что хочешь!

Неманья
источник
10

Я думаю, что проще всего было бы

var items = $('img, style, ...'), itemslen = items.length;

items.bind('load', function(){ 
    itemslen--;
    if (!itemlen) // Do stuff here
});

ИЗМЕНИТЬ, чтобы быть немного сумасшедшим:

var items = $('a, abbr, acronym, address, applet, area, audio, b, base, ' + 
    'basefont, bdo, bgsound, big, body, blockquote, br, button, canvas, ' + 
    'caption, center, cite, code, col, colgroup, comment, custom, dd, del, ' +
    'dfn, dir, div, dl, document, dt, em, embed, fieldset, font, form, frame, ' +
    'frameset, head, hn, hr, html, i, iframe, img, input, ins, isindex, kbd, ' +
    'label, legend, li, link, listing, map, marquee, media, menu, meta, ' +
    'nextid, nobr, noframes, noscript, object, ol, optgroup, option, p, ' +
    'param, plaintext, pre, q, rt, ruby, s, samp, script, select, small, ' + 
    'source, span, strike, strong, style, sub, sup, table, tbody, td, ' + 
    'textarea, tfoot, th, thead, title, tr, tt, u, ul, var, wbr, video, ' + 
    'window, xmp'), itemslen = items.length;

items.bind('load', function(){ 
    itemslen--;
    if (!itemlen) // Do stuff here
});
qwertymk
источник
Мне вроде как нравится эта идея, ОДНАКО itemslen, кажется, никогда не обратится в обратный отсчет до 0.
Баннинг
1
ОСТЕРЕГАЙТЕСЬ ЭТОГО МЕТОДА - он предполагает, что все перечисленные элементы имеют событие load, которого нет у многих из них в примере.
Джон Уэджбери
6

Другой вариант вы можете проверить document.readyState, например,

var chkReadyState = setInterval(function() {
    if (document.readyState == "complete") {
        // clear the interval
        clearInterval(chkReadyState);
        // finally your page is loaded.
    }
}, 100);

Из документации страницы readyState краткое изложение полного состояния

Возвращает «загрузка» во время загрузки документа, «интерактивный» - после завершения анализа, но по-прежнему загружает подресурсы, и «завершение» после загрузки.

Рохан Кумар
источник
У меня были проблемы с кешированными изображениями, и, похоже, это лучший код для этого по производительности ... Хотите узнать о практике? Вроде бы лучше, чем jQuery $(window).on("load" function () {//dostuff})...?
кмкмкм
3

Один из вариантов - оставить страницу пустой, содержащей небольшое количество javascript. Используйте сценарий, чтобы сделать вызов AJAX, чтобы получить фактическое содержимое страницы, и пусть функция успеха записывает результат поверх текущего документа. В функции тайм-аута вы можете «сделать еще что-нибудь потрясающее»

Примерный псевдокод:

$(document).ready(function(){
    $.ajax
      url of actual page
      success:do something amazing
      timeout: do something else
});
yoozer8
источник
Да, это. Но это первый способ, который пришел в голову, когда я спросил себя: «Как страница может узнать, истекло ли время ожидания запроса?»
yoozer8
ну, он не скажет вам, завершили ли изображения загрузку .. скорее он скажет только, загружена ли необработанная разметка
samccone
Хм. Подводит меня к интересному вопросу. Если вы только что сделали $ (document) .html (response), а ответ содержал document.ready или window.load, будет ли это выполнено после того, как документ будет написан? Или браузер будет видеть страницу как уже загруженную и не вызывать их при изменении содержимого?
yoozer8
я думаю, он вызовет это во второй раз, но не на 100% ... попробуйте
samccone
2

Вы это имели в виду?

$("document").ready( function() {
    // do your stuff
}
Джон Смит
источник
1
Это запустится, когда DOM будет готов, но это может быть до того, как загрузятся такие вещи, как изображения.
Джеймс Аллардис
2

Без jquery или чего-то подобного, почему бы и нет?

var loaded=0;
var loaded1min=0;
document.addEventListener("DOMContentLoaded", function(event) {
   loaded=1;
    setTimeout(function () {
      loaded1min=1;
    }, 60000);
});
Cth103
источник
1
Это правильно, но немного отличается от того, что jqueryработает. DOMContentLoadedзапускается только после загрузки внешнего контента (особенно изображений, что может занять много времени в определенных условиях). jqueryвыполняется .ready()с использованием определенных событий браузера, которые (в большинстве браузеров) происходят до загрузки внешнего содержимого.
grochmal
1

К вашему сведению людей, которые спрашивали в комментариях, это то, что я фактически использовал в проектах:

function onLoad(loading, loaded) {
    if(document.readyState === 'complete'){
        return loaded();
    }
    loading();
    if (window.addEventListener) {
        window.addEventListener('load', loaded, false);
    }
    else if (window.attachEvent) {
        window.attachEvent('onload', loaded);
    }
};

onLoad(function(){
   console.log('I am waiting for the page to be loaded');
},
function(){
    console.log('The page is loaded');
});
Кэмерон
источник