Gibt es eine definitive JavaScript-Methode (nicht jQuery), um zu prüfen, ob eine Webseite vollständig geladen wurde?

8

Gibt es eine definitive JavaScript-Methode, um zu prüfen, ob eine Webseite vollständig geladen wurde? Komplett, also 100% komplett. HTML, Skripte, CSS, Bilder, Plugins, AJAX, alles!

Da Benutzerinteraktion AJAX beeinflussen kann, nehmen wir an, dass abgesehen von der anfänglichen Seitenanforderung keine weitere Benutzerinteraktion mit der Seite stattfindet.

    
jnthnclrk 31.05.2011, 16:41
quelle

7 Antworten

8

Was du verlangst, ist ziemlich unmöglich. Es gibt keine Möglichkeit festzustellen, ob alles vollständig geladen ist. Hier ist warum:

  • Auf vielen Webseiten startet AJAX erst, wenn das Ereignis onload (oder DOMReady ) ausgelöst wird. Dadurch wird die Methode onload verwenden verwendet, um festzustellen, ob die Seite geladen wurde.
  • Sie könnten theoretisch feststellen, ob die Webseite eine AJAX-Anfrage durch Überschreiben von window.XMLHttpRequest ausgeführt hat, aber Sie konnten immer noch nicht feststellen, ob Plugins wie Flash noch geladen wurden oder nicht.
  • Auf einigen Websites wie Twitter.com wird die Seite nur einmal geladen und stellt beim Klicken auf einen Link einfach AJAX-Anforderungen an den Server . Wie können Sie feststellen, ob die Seite auf einer solchen Seite geladen wurde?
  • Tatsächlich kann der Browser selbst nicht ganz sicher sein, ob die Seite vollständig geladen wurde oder ob weitere AJAX-Anfragen gestellt werden sollen.

Der einzige Weg, um sicher zu sein, dass alles geladen ist jedes einzelne Stück Code auf der Seite, die etwas lädt Ihren Code sagen, dass es fertig ist, sobald es geladen wird.

Eine hackige, unvollständige Lösung: Sie könnten versuchen, XMLHttpRequest mit einer Funktion zu überschreiben, die das vorhandene XMLHttpRequest umschließt und zurückgibt. Dadurch können Sie feststellen, ob gerade ein AJAX-Ereignis stattfindet. Diese Lösung funktioniert jedoch nicht, um zu sehen, ob Plugins geladen sind, und Sie könnten den Unterschied zwischen AJAX-Ereignissen, die beim Laden der Seite ausgelöst werden, und AJAX-Anfragen, die sich periodisch ändern, wie die Änderungen am Stack Overflow, nicht unterscheiden das Stack Exchange-Symbol oben links, wenn Sie neue Benachrichtigungen haben.

Versuchen Sie etwas wie folgt:

%Vor%     
Na7coldwater 09.07.2011, 23:46
quelle
4

Das:

%Vor%

Ereignis wird an diesem Punkt ausgelöst.

    
ADW 31.05.2011 16:43
quelle
4
%Vor%

oder

%Vor%     
Keith 31.05.2011 16:48
quelle
3

Grundsätzlich beantworten ADW und Keith die Frage, aber ich würde vorschlagen, window.onload nicht zu verwenden, aber:

%Vor%     
roberkules 08.07.2011 13:47
quelle
2

Wenn Sie eine Kombination aus window.onload , document.readyState und Callbacks für AJAX-Anfragen verwenden, sollten Sie in der Lage sein zu tun, was Sie wollen. Stellen Sie einfach sicher, dass das Fenster geladen ist, das DOM zur Manipulation bereit ist und verfolgen Sie die AJAX-Anfragen.

Insbesondere für AJAX, abhängig von der Anzahl der von Ihnen gestellten Anforderungen: Erhöhen Sie bei jeder Anforderung eine Variable, und wenn die Variable === die Gesamtanzahl der Anfragen auslöst, führen Sie eine Funktion aus. Wenn Sie die Anzahl der AJAX-Anfragen nicht kennen, aber wissen, welche die letzten wären, lassen Sie einfach eine Callback-Funktion auslösen, wenn sie fertig ist.

Wenn alles gesetzt und wahr ist, feuern Sie eine letzte Funktion ab, um das zu tun, was Sie wollen, in dem Wissen, dass alles geladen werden sollte.

In Bezug auf Flash- und Silverlight-Anwendungen (nicht sicher, ob window.onload oder document.ready diese verfolgt) könnten Sie auch die Menge der mit der Anwendung geladenen Daten aufzeichnen, und wenn die geladenen Daten === die Summe Daten, lassen Sie die Anwendung eine Funktion auslösen oder eine Variable auf die Seite erhöhen.

%Vor%     
Shaz 14.07.2011 15:14
quelle
1

Hier ist die nicht aufdringliche js-Funktion, die ich geschrieben habe, unter Verwendung von Ereignissen beim Laden. In diesem Fall feuere ich Ereignisse auf js-Skript, da dies meine js-Autoloader-Funktion ist, aber Sie können einfach Ereignisse auf anderen Elementen hinzufügen, die dasselbe Prinzip verwenden. Vorausgesetzt, dieses Script kümmert sich um js-Skripte, die in einem dedizierten Tag div geladen sind.

%Vor%     
hornetbzz 11.07.2011 10:58
quelle
-1
%Vor%

Mit freundlicher Genehmigung: Kleinster DOMReady-Code, je - Dustin Diaz

Update: Und für IE

%Vor%

P.S: window.onload ist eine ganz andere Sache

    
naveen 31.05.2011 16:55
quelle

Tags und Links