Detectar si la página ha terminado de cargarse

91

¿Hay alguna forma de detectar cuando una página ha terminado de cargarse, es decir, todo su contenido, javascript y activos como css e imágenes?

asi como:

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

y además, si la página se ha estado cargando durante más de 1 minuto, haga otra cosa como:

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

He visto sitios web como MobileMe de Apple realizar comprobaciones similares, pero no he podido averiguarlo en sus enormes bibliotecas de códigos.

¿Alguien puede ayudar?

Gracias

EDITAR: Esto es esencialmente lo que quiero hacer:

// 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);
});
Cameron
fuente
2
¿Hay alguna razón por la que window.onload(o $(window).load()) no funcionaría?
sdleihssirhc
Hola @Cameron. ¿Qué código funciona para ocultar el cargador después de que la página ha terminado de cargarse?
tnkh
@TonyNg Vea mi respuesta: stackoverflow.com/questions/7083693/…
Cameron

Respuestas:

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

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

});

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

Consulte también http://api.jquery.com/load-event/ para obtener una explicación sobre jQuery (ventana) .load.

Actualizar

En esta página se puede encontrar una explicación detallada sobre cómo funciona la carga de JavaScript y los dos eventos DOMContentLoaded y OnLoad .

DOMContentLoaded : cuando el DOM está listo para ser manipulado. La forma de jQuery de capturar este evento es con jQuery(document).ready(function () {});.

OnLoad : cuando el DOM está listo y todos los activos , esto incluye imágenes, iframe, fuentes, etc. , se han cargado y la clase de rueda giratoria / hora desaparece. La forma de jQuery de capturar este evento es la mencionada anteriormente jQuery(window).load.

TJ.
fuente
Si miras mi OP, lo he modificado para que muestre cuáles son mis objetivos. Entonces, esencialmente, quiero mostrar la página después de que todos los activos se hayan cargado y desaparezcan un cargador y desaparezcan en el contenido. ¿Mi código funcionaría correctamente? Saludos
Cameron
Su código se ve bien, pero tendría que verlo en acción para estar seguro.
TJ.
@Jimmer Sí: MDN : "El evento de carga se activa cuando un recurso y sus recursos dependientes han terminado de cargarse".
TJ.
2
Tenga en cuenta que jQuery.load()quedó obsoleto desde jQuery / 1.8 y se eliminó en jQuery / 3. La sintaxis actual es jQuery(window).on("load", function(){/*...*/});.
Álvaro González
58

Hay dos formas de hacer esto en jquery dependiendo de lo que esté buscando.

usando jquery puedes hacer

  • // esto esperará a que se carguen los activos de texto antes de llamar a esto (el dom .. css .. js)

    $(document).ready(function(){...});
  • // esto esperará a que todas las imágenes y activos de texto terminen de cargarse antes de ejecutar

    $(window).load(function(){...});
samccone
fuente
En este método, ¿cómo puede saber si la página se ha estado cargando durante varios minutos pero aún no está completa?
yoozer8
2
esto se puede lograr con un setTimeout (function () {!loaded && foo ();}, 20000); y establecer cargado en verdadero en el documento listo o carga de ventana
samccone
1
para jquery 3.0 use $ (ventana) .on ("cargar", función (e) {});
zero8
13

Eso se llama onload. DOM ready se creó en realidad por la razón exacta por la que onload esperaba imágenes. (Respuesta tomada de Matchu a una pregunta similar hace un tiempo).

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

onload espera todos los recursos que forman parte del documento.

Enlace a una pregunta donde lo explicó todo:

Haz clic en mí, ¡sabes que quieres!

Nemanja
fuente
10

Creo que la forma más fácil sería

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

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

EDITAR, para estar un poco loco:

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
fuente
Me gusta esta idea SIN EMBARGO, itemslen nunca parece contar hacia atrás hasta 0.
Prohibición el
1
TENGA CUIDADO CON ESTE MÉTODO: se supone que todos los elementos enumerados tienen un evento de 'carga', que muchos de ellos en el ejemplo no tienen.
John Wedgbury
6

Otra opción puede consultar el document.readyState como,

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

De la documentación de readyState Page, el resumen del estado completo es

Devuelve "cargando" mientras se carga el documento, "interactivo" una vez que ha terminado de analizar pero aún cargando sub-recursos, y "completo" una vez que se ha cargado.

Rohan Kumar
fuente
He tenido problemas con las imágenes almacenadas en caché, y este parece ser el mejor código para eso en rendimiento ... ¿Te preguntas sobre la práctica? Parece ser mejor que el jQuery $(window).on("load" function () {//dostuff})...?
kmkmkm
3

Una opción es que la página esté en blanco y que contenga una pequeña cantidad de JavaScript. Utilice el script para realizar una llamada AJAX para obtener el contenido real de la página y haga que la función de éxito escriba el resultado sobre el documento actual. En la función de tiempo de espera puedes "hacer algo más asombroso"

Pseudocódigo aproximado:

$(document).ready(function(){
    $.ajax
      url of actual page
      success:do something amazing
      timeout: do something else
});
yoozer8
fuente
Sí lo es. Pero es la primera forma que me vino a la mente cuando me pregunté: "¿Cómo puede una página saber si una solicitud expira?"
yoozer8
bueno, no le dirá si las imágenes han terminado de cargarse ... sino que solo dirá si se ha cargado el marcado sin
formato
Hm. Me lleva a una pregunta interesante. Si acaba de hacer $ (document) .html (response), y la respuesta contiene un document.ready o un window.load, ¿se ejecutará una vez que se escriba el documento? ¿O el navegador vería la página como ya cargada y no los llamaría en el cambio de contenido?
yoozer8
Creo que lo llamará por segunda vez, pero no al 100% ... pruébalo
samccone
2

¿Es esto lo que tenías en mente?

$("document").ready( function() {
    // do your stuff
}
John Smith
fuente
1
Esto se ejecutará cuando el DOM esté listo, pero puede ser antes de que terminen de cargarse cosas como las imágenes.
James Allardice
2

Sin jquery ni nada de eso porque ¿por qué no?

var loaded=0;
var loaded1min=0;
document.addEventListener("DOMContentLoaded", function(event) {
   loaded=1;
    setTimeout(function () {
      loaded1min=1;
    }, 60000);
});
Cth103
fuente
Esto es correcto, pero ligeramente diferente de lo que jqueryfunciona. DOMContentLoadedse activa solo después de que se cargue el contenido externo (en particular, imágenes, que pueden llevar mucho tiempo en determinadas condiciones). jqueryrealiza .ready()usando eventos específicos del navegador, que (en la mayoría de los navegadores) ocurren antes de que se cargue el contenido externo.
Grochmal
1

Para su información de las personas que han preguntado en los comentarios, esto es lo que realmente usé en los proyectos:

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');
});
Cameron
fuente