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


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(){...});
    

Как с помощью этого метода узнать, загружалась ли страница несколько минут, но еще не завершена?
— 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
});

Мне вроде как нравится эта идея, ОДНАКО 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

ну, он не скажет вам, завершили ли изображения загрузку .. скорее он скажет только, загружена ли необработанная разметка
— 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);
});

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');
});
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.