Rileva se la pagina ha terminato il caricamento


91

C'è un modo per rilevare quando una pagina ha terminato il caricamento, cioè tutto il suo contenuto, javascript e risorse come css e immagini?

così come:

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

e inoltre, se la pagina è stata caricata per più di 1 minuto, fai qualcos'altro come:

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

Ho visto siti web come MobileMe di Apple fare controlli simili ma non sono stato in grado di capirlo nelle loro enormi librerie di codici.

Qualcuno può aiutare?

Grazie

EDIT: Questo è essenzialmente quello che voglio fare:

// 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
C'è una ragione per cui window.onload(o $(window).load()) non funzionerebbe?
sdleihssirhc

Ciao @Cameron. Quale codice funziona per nascondere il caricatore al termine del caricamento della pagina?
tnkh

@TonyNg Vedi la mia risposta: stackoverflow.com/questions/7083693/…
Cameron

Risposte:


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

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

});

Oppure http://jsfiddle.net/tangibleJ/fLLrs/1/

Vedere anche http://api.jquery.com/load-event/ per una spiegazione su jQuery (finestra) .load.

Aggiornare

Una spiegazione dettagliata su come funziona il caricamento di javascript e sui due eventi DOMContentLoaded e OnLoad può essere trovata in questa pagina .

DOMContentLoaded : quando il DOM è pronto per essere manipolato. Il modo in cui jQuery cattura questo evento è con jQuery(document).ready(function () {});.

OnLoad : quando il DOM è pronto e tutte le risorse , incluse immagini, iframe, caratteri, ecc ., Sono state caricate e la classe ruota che gira / ora scompare. Il modo in cui jQuery cattura questo evento è il suddetto jQuery(window).load.


Se guardi il mio PO, l'ho modificato in modo che mostri quali sono i miei obiettivi. Quindi essenzialmente voglio mostrare la pagina dopo che tutte le risorse sono state caricate e dissolvenza in un caricatore e dissolvenza nel contenuto. Il mio codice funzionerebbe correttamente? Saluti
Cameron

Il tuo codice sembra a posto ma dovrei vederlo in azione per esserne sicuro.
TJ.

@Jimmer Yes: MDN : "L'evento di caricamento viene
TJ.

2
Tieni presente che è jQuery.load()stato deprecato da jQuery / 1.8 e rimosso in jQuery / 3. La sintassi corrente è jQuery(window).on("load", function(){/*...*/});.
Álvaro González

58

ci sono due modi per farlo in jquery a seconda di cosa stai cercando.

usando jquery puoi farlo

  • // questo attenderà il caricamento delle risorse di testo prima di chiamarlo (dom .. css .. js)

    $(document).ready(function(){...});
  • // questo attenderà che tutte le immagini e le risorse di testo finiscano di caricarsi prima dell'esecuzione

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

In questo metodo, come puoi sapere se la pagina è stata caricata per diversi minuti ma non è ancora completa?
yoozer8

2
questo può essere ottenuto con un setTimeout (function () {! load && foo ();}, 20000); e impostare caricato su true nel documento pronto o caricamento finestra
samccone

1
per jquery 3.0 usa $ (window) .on ("load", function (e) {});
zero8

13

Si chiama onload. DOM ready è stato effettivamente creato per l'esatto motivo per cui onload attendeva le immagini. (Risposta presa da Matchu su una domanda simile qualche tempo fa.)

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

onload attende tutte le risorse che fanno parte del documento.

Link a una domanda in cui ha spiegato tutto:

Cliccami, sai che vuoi!


10

Penso che il modo più semplice sarebbe

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

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

EDIT, per essere un po 'pazzi:

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

Mi piace questa idea TUTTAVIA itemslen non sembra mai contare alla rovescia fino a 0.
Bando il

1
ATTENZIONE A QUESTO METODO - Si presume che tutti gli elementi elencati abbiano un evento di "caricamento", cosa che molti di loro nell'esempio non hanno.
John Wedgbury

6

Un'altra opzione è possibile controllare il document.readyState come,

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

Dalla documentazione di readyState Page il riepilogo dello stato completo è

Restituisce "caricamento" durante il caricamento del documento, "interattivo" una volta terminata l'analisi ma ancora il caricamento delle sotto-risorse e "completo" una volta caricate.


Ho avuto problemi con le immagini memorizzate nella cache e questo sembra essere il codice migliore per questo in termini di prestazioni ... Ti stai chiedendo della pratica? Sembra essere migliore di jQuery $(window).on("load" function () {//dostuff})...?
kmkmkm

3

Un'opzione è che la pagina sia vuota, contenente una piccola quantità di javascript. Utilizzare lo script per effettuare una chiamata AJAX per ottenere il contenuto effettivo della pagina e fare in modo che la funzione success scriva il risultato sul documento corrente. Nella funzione timeout puoi "fare qualcos'altro di straordinario"

Pseudocodice approssimativo:

$(document).ready(function(){
    $.ajax
      url of actual page
      success:do something amazing
      timeout: do something else
});

Sì. Ma è il primo modo che mi è venuto in mente quando mi sono chiesto "Come può una pagina dire se una richiesta scade?"
yoozer8

beh non ti dirà se le immagini hanno terminato il caricamento .. piuttosto dirà solo se il markup grezzo è stato caricato
samccone

Hm. Mi porta a una domanda interessante. Se hai appena fatto $ (document) .html (risposta) e la risposta contenesse un document.ready o un window.load, verrebbe eseguito una volta che il documento è stato scritto? Oppure il browser vedrebbe la pagina come già caricata e non la richiamerebbe al cambio di contenuto?
yoozer8

penso che lo chiamerà una seconda volta ma non al 100% ... provalo
samccone

2

È questo quello che avevi in ​​mente?

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

1
Questo verrà eseguito quando il DOM è pronto, ma ciò può avvenire prima che cose come le immagini abbiano terminato il caricamento.
James Allardice


2

Senza jquery o qualcosa del genere perché no?

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

Questo è corretto, ma leggermente diverso da quello che jqueryesegue. DOMContentLoadedviene attivato solo dopo il caricamento del contenuto esterno (in particolare le immagini, che possono richiedere molto tempo in determinate condizioni). jqueryesegue .ready()utilizzando eventi specifici del browser, che (sulla maggior parte dei browser) si verificano prima del caricamento del contenuto esterno.
Grochmal

1

Cordiali saluti delle persone che hanno chiesto nei commenti, questo è ciò che ho effettivamente usato nei progetti:

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');
});
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.