Ermitteln Sie, ob die Seite vollständig geladen wurde

91

Gibt es eine Möglichkeit zu erkennen, wann eine Seite vollständig geladen wurde, dh alle Inhalte, Javascript und Assets wie CSS und Bilder?

So wie:

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

und zusätzlich, wenn die Seite länger als 1 Minute geladen wurde, tun Sie etwas anderes wie:

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

Ich habe gesehen, dass Websites wie Apples MobileMe ähnliche Überprüfungen durchgeführt haben, konnte dies jedoch in ihren riesigen Codebibliotheken nicht herausfinden.

Kann jemand helfen?

Vielen Dank

EDIT: Dies ist im Wesentlichen, was ich tun möchte:

// 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
quelle
2
Gibt es einen Grund, warum window.onload(oder $(window).load()) nicht funktionieren würde?
sdleihssirhc
Hallo @Cameron. Mit welchem ​​Code wird der Loader nach dem Laden der Seite ausgeblendet?
tnkh
@ TonyNg Siehe meine Antwort: stackoverflow.com/questions/7083693/…
Cameron

Antworten:

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

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

});

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

Unter http://api.jquery.com/load-event/ finden Sie eine Erläuterung zur jQuery (Fenster) .load.

Aktualisieren

Eine ausführliche Erklärung zur Funktionsweise des JavaScript-Ladens und zu den beiden Ereignissen DOMContentLoaded und OnLoad finden Sie auf dieser Seite .

DOMContentLoaded : Wenn das DOM zur Bearbeitung bereit ist. jQuerys Art, dieses Ereignis zu erfassen, ist mit jQuery(document).ready(function () {});.

OnLoad : Wenn das DOM bereit ist und alle Assets - einschließlich Bilder, Iframe, Schriftarten usw. - geladen wurden und die sich drehende Rad- / Stundenklasse verschwindet. Die Methode von jQuery zur Erfassung dieses Ereignisses ist die oben erwähnte jQuery(window).load.

TJ.
quelle
Wenn Sie sich mein OP ansehen, habe ich es so geändert, dass es zeigt, was meine Ziele sind. Im Wesentlichen möchte ich die Seite anzeigen, nachdem alle Assets geladen wurden, einen Loader ausblenden und den Inhalt einblenden. Würde mein Code richtig funktionieren? Prost
Cameron
Ihr Code sieht in Ordnung aus, aber ich müsste ihn in Aktion sehen, um sicherzugehen.
TJ.
@Jimmer Ja: MDN : "Das
TJ.
2
Bitte beachten Sie, dass dies jQuery.load()seit jQuery / 1.8 veraltet und in jQuery / 3 entfernt wurde. Aktuelle Syntax ist jQuery(window).on("load", function(){/*...*/});.
Álvaro González
58

Es gibt zwei Möglichkeiten, dies in jquery zu tun, je nachdem, wonach Sie suchen.

Mit jquery können Sie tun

  • // Dies wartet darauf, dass die Text-Assets geladen werden, bevor dies aufgerufen wird (dom .. css .. js).

    $(document).ready(function(){...});
  • // Dies wartet, bis alle Bilder und Textelemente geladen sind, bevor sie ausgeführt werden

    $(window).load(function(){...});
Samccone
quelle
Wie können Sie bei dieser Methode feststellen, ob die Seite einige Minuten lang geladen wurde, aber noch nicht vollständig ist?
yoozer8
2
Dies kann mit einem setTimeout (function () {! geladen && foo ();}, 20000) erreicht werden. und setzen Sie geladen in true im Dokument bereit oder Fenster laden
Samccone
1
Verwenden Sie für jquery 3.0 $ (window) .on ("load", function (e) {});
Null8
13

Das nennt man Onload. DOM ready wurde tatsächlich aus dem genauen Grund erstellt, aus dem Onload auf Bilder wartete. (Antwort von Matchu auf eine ähnliche Frage vor einiger Zeit.)

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

Onload wartet auf alle Ressourcen, die Teil des Dokuments sind.

Link zu einer Frage, in der er alles erklärt hat:

Klicken Sie auf mich, Sie wissen, dass Sie wollen!

Nemanja
quelle
10

Ich denke, der einfachste Weg wäre

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

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

EDIT, um ein bisschen verrückt zu sein:

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
quelle
Ich mag diese Idee JEDOCH JEDOCH scheint Itemslen nie bis 0 herunterzuzählen.
Verbot
1
ACHTUNG ZU DIESER METHODE - Es wird davon ausgegangen, dass alle aufgelisteten Elemente ein Ladeereignis haben, was viele von ihnen im Beispiel nicht tun.
John Wedgbury
6

Eine weitere Option, die Sie im document.readyState überprüfen können , ist:

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

Aus der Dokumentation der readyState-Seite geht die Zusammenfassung des vollständigen Status hervor

Gibt "Laden" zurück, während das Dokument geladen wird, "Interaktiv", sobald das Parsen abgeschlossen ist, aber immer noch Unterressourcen geladen werden, und "Fertig", sobald es geladen wurde.

Rohan Kumar
quelle
Ich hatte Probleme mit zwischengespeicherten Bildern, und dies scheint der bessere Code für die Leistung zu sein ... Fragen Sie sich über das Üben? Scheint besser zu sein als die jQuery $(window).on("load" function () {//dostuff})...?
kmkmkm
3

Eine Möglichkeit besteht darin, dass die Seite leer ist und eine kleine Menge Javascript enthält. Verwenden Sie das Skript, um einen AJAX-Aufruf durchzuführen, um den tatsächlichen Seiteninhalt abzurufen, und lassen Sie die Erfolgsfunktion das Ergebnis über das aktuelle Dokument schreiben. In der Timeout-Funktion können Sie "etwas anderes Erstaunliches tun"

Ungefährer Pseudocode:

$(document).ready(function(){
    $.ajax
      url of actual page
      success:do something amazing
      timeout: do something else
});
yoozer8
quelle
Ja, so ist es. Aber es ist der erste Weg, der mir in den Sinn kam, als ich mich fragte: "Wie kann eine Seite erkennen, ob eine Anfrage dafür abgelaufen ist?"
yoozer8
Nun,
Hm. Führt mich zu einer interessanten Frage. Wenn Sie nur $ (document) .html (response) ausgeführt haben und die Antwort ein document.ready oder eine window.load enthielt, würde dies ausgeführt, sobald das Dokument geschrieben wurde? Oder würde der Browser die Seite als bereits geladen ansehen und sie bei der Inhaltsänderung nicht aufrufen?
yoozer8
Ich denke, es wird es ein zweites Mal nennen, aber nicht 100% ... probieren Sie es aus
Samccone
2

Hast du das gedacht?

$("document").ready( function() {
    // do your stuff
}
John Smith
quelle
1
Dies wird ausgeführt, wenn das DOM bereit ist. Dies kann jedoch geschehen, bevor das Laden von Bildern abgeschlossen ist.
James Allardice
2

Ohne jquery oder so etwas, warum nicht?

var loaded=0;
var loaded1min=0;
document.addEventListener("DOMContentLoaded", function(event) {
   loaded=1;
    setTimeout(function () {
      loaded1min=1;
    }, 60000);
});
Cth103
quelle
Dies ist richtig, unterscheidet sich jedoch geringfügig von jqueryder Leistung. DOMContentLoadedwird erst ausgelöst, nachdem externer Inhalt geladen wurde (insbesondere Bilder, die unter bestimmten Bedingungen lange dauern können). jqueryFunktioniert .ready()mit browserspezifischen Ereignissen, die (bei den meisten Browsern) auftreten, bevor externe Inhalte geladen werden.
gro♀
1

Zu Ihrer Information von Leuten, die in den Kommentaren gefragt haben, das habe ich tatsächlich in Projekten verwendet:

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
quelle