Визначте, чи завантаження сторінки закінчилось


91

Чи є спосіб виявити, коли сторінка закінчила завантаження, тобто весь її вміст, javascript та активи, такі як css та зображення?

так подобається:

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

а також додатково, якщо сторінка завантажувалася більше 1 хв, зробіть щось інше, наприклад:

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

Я бачив, як веб-сайти, такі як Apple MobileMe, проводять подібні перевірки, але не змогли це зрозуміти у своїх величезних бібліотеках коду.

Хто-небудь може допомогти?

Дякую

EDIT: Це по суті те, що я хочу зробити:

// 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

@TonyNg Див. Мою відповідь: stackoverflow.com/questions/7083693/…
Камерон

Відповіді:


125
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 (вікно) .load.

Оновлення

Детальне пояснення того, як працює завантаження javascript та дві події DOMContentLoaded та OnLoad, можна знайти на цій сторінці .

DOMContentLoaded : Коли DOM готовий до маніпуляцій. jQuery дозволяє записати цю подію за допомогою jQuery(document).ready(function () {});.

OnLoad : Коли DOM готовий, і всі ресурси - включаючи зображення, iframe, шрифти тощо - завантажуються, і крутиться колесо / година. Спосіб фіксації цієї події jQuery є вищезгаданим jQuery(window).load.


Якщо ви подивитесь на мій ОП, я змінив його таким чином, щоб він показував, які мої цілі. Отже, по суті, я хочу показати сторінку після того, як усі ресурси завантажуються та зникають навантажувачем та зникають у вмісті. Чи мій код працюватиме правильно? Вітання
Камерон

З вашим кодом виглядає добре, але мені доведеться побачити його в дії, щоб бути впевненим.
TJ.

@Jimmer Так: MDN : "Подія завантаження
TJ.

2
Зверніть увагу, що jQuery.load()застаріла з jQuery / 1.8 та вилучена у jQuery / 3. Поточний синтаксис jQuery(window).on("load", function(){/*...*/});.
Альваро Гонсалес

58

Є два способи зробити це в jquery залежно від того, що ви шукаєте ..

за допомогою jquery ви можете це зробити

  • // це буде чекати завантаження текстових ресурсів перед викликом цього (dom .. css .. js)

    $(document).ready(function(){...});
  • // це зачекає, поки всі зображення та текстові ресурси закінчать завантаження перед виконанням

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

Як ви можете визначити, що сторінка завантажується протягом декількох хвилин, але ще не завершена?
yoozer8

2
це може бути здійснено за допомогою setTimeout (function () {! loaded && foo ();}, 20000); і встановити значення true в документі готово або завантажити вікно
samccone

1
для jquery 3.0 використовуйте $ (window) .on ("load", function (e) {});
нуль8

13

Це називається onload. Файл DOM ready був фактично створений саме з тієї причини, що завантаження очікувало на зображення. (Відповідь взята у Matchu на подібне запитання деякий час тому.)

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
});

EDIT, щоб бути трохи божевільним:

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
});

Мені така ідея подобається, ОДНАКО, як здається, предмет ніколи не відраховує до 0.
Заборона

1
ОСТЕРЕЖАЙТЕСЯ ЦЬОГО МЕТОДУ - Він передбачає, що всі перераховані елементи мають подію „завантаження”, чого у багатьох із прикладу немає.
Джон Веджбері

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 (відповідь), і відповідь містив document.ready або window.load, чи буде це виконано, як тільки документ буде написаний? Або браузер бачить сторінку вже завантаженою і не викликає їх при зміні вмісту?
yoozer8

я думаю, це буде
викликано

2

Це ви мали на увазі?

$("document").ready( function() {
    // do your stuff
}

1
Це буде працювати, коли DOM буде готовий, але це може бути до того, як такі речі, як зображення, закінчать завантаження.
James Allardice


2

Без jquery чи чогось подібного, тому що ні?

var loaded=0;
var loaded1min=0;
document.addEventListener("DOMContentLoaded", function(event) {
   loaded=1;
    setTimeout(function () {
      loaded1min=1;
    }, 60000);
});

Це правильно, але трохи відрізняється від того, що jqueryвиконує. DOMContentLoadedспрацьовує лише після завантаження зовнішнього вмісту (зокрема, зображень, що може зайняти багато часу за певних умов). jqueryвиконує .ready()за допомогою специфічних для браузера подій, які (у більшості браузерів) відбуваються до завантаження зовнішнього вмісту.
грохмаль

1

FYI людей, які запитували в коментарях, ось що я насправді використовував у проектах:

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.