Funktion nach vollständigem Laden der Seite ausführen

121

Ich verwende folgenden Code, um einige Anweisungen nach dem Laden der Seite auszuführen.

 <script type="text/javascript">
    window.onload = function () { 

        newInvite();
        document.ag.src="b.jpg";
    }
</script>

Dieser Code funktioniert jedoch nicht ordnungsgemäß. Die Funktion wird auch dann aufgerufen, wenn einige Bilder oder Elemente geladen werden. Ich möchte die Funktion aufrufen, wenn die Seite vollständig geladen ist.

Neeraj Kumar
quelle
1
Könnten Sie eine Demo auf JSFiddle.net hinzufügen ?
Einige Guy
2
Könnten Sie jQuery verwenden? Wenn ja, versuchen Sie$(window).load()
Matt Hintzke
Ja, können Sie genau erklären, was nicht richtig funktioniert? Erhalten Sie eine Fehlermeldung oder rufen Sie eine alertFunktion auf, bevor das Fenster neu gezeichnet wird (sodass es so aussieht, als würde es vor dem Laden aufgerufen)? Der Code sieht gut aus, und wenn Benutzer gezwungen werden, große Bibliotheken herunterzuladen, wird dieses Problem wahrscheinlich nicht behoben oder die Diagnose wird einfacher.
Jeffrey Sweeney
Wenn ich sage, dass es nicht funktioniert, meine ich, dass die Funktion ausgelöst wird, selbst wenn einige Bilder geladen werden.
Neeraj Kumar

Antworten:

166

Dies kann für Sie funktionieren:

document.addEventListener('DOMContentLoaded', function() {
   // your code here
}, false);

oder wenn Sie sich mit jquery wohl fühlen,

$(document).ready(function(){
// your code
});

$(document).ready()wird auf DOMContentLoaded ausgelöst, aber dieses Ereignis wird unter Browsern nicht konsistent ausgelöst. Aus diesem Grund wird jQuery höchstwahrscheinlich einige umfangreiche Problemumgehungen implementieren, um alle Browser zu unterstützen. Und dies wird es sehr schwierig machen, das Verhalten mit einfachem Javascript "genau" zu simulieren (aber natürlich nicht unmöglich).

Wie Jeffrey Sweeney und J Torres vorgeschlagen haben, ist es meiner Meinung nach besser, eine setTimeoutFunktion zu haben , bevor die Funktion wie folgt ausgelöst wird:

setTimeout(function(){
 //your code here
}, 3000);
Shreedhar
quelle
12
jQuery's readywird nicht das tun, was das OP angefordert hat. readyWird ausgelöst, wenn das DOM geladen wird, nicht nachdem Elemente geladen wurden. loadwird ausgelöst, nachdem die Elemente geladen / gerendert wurden.
Jaime Torres
Es sieht so aus, als ob das OP möchte, dass alle Elemente vollständig geladen werden, nicht nur der HTML-Code.
Jeffrey Sweeney
3
@shreedhar oder er könnte das richtige Werkzeug für den Job verwenden ( load).
Jaime Torres
14
setTimeoutist eine schlechte Idee. Das Laden der Seite dauert weniger als 3 Sekunden (oder n Sekunden, je nachdem, welchen Wert Sie wählen). Wenn das Laden länger dauert, funktioniert es nicht. Wenn die Seite schneller geladen wird, muss sie ohne Grund warten.
JJJ
1
@ChristianMatthew its useCapture Wenn true, gibt useCapture an, dass der Benutzer die Erfassung starten möchte. Nach dem Starten der Erfassung werden alle Ereignisse des angegebenen Typs an den registrierten Listener gesendet, bevor sie an alle darunter liegenden EventTargets in der DOM-Struktur gesendet werden. Ereignisse, die durch den Baum nach oben sprudeln, lösen keinen Listener aus, der für die Verwendung der Erfassung vorgesehen ist. Eine ausführliche Erläuterung finden Sie unter DOM Level 3-Ereignisse .
Shreedhar
52

JavaScript

document.addEventListener('readystatechange', event => { 

    // When HTML/DOM elements are ready:
    if (event.target.readyState === "interactive") {   //does same as:  ..addEventListener("DOMContentLoaded"..
        alert("hi 1");
    }

    // When window loaded ( external resources are loaded too- `css`,`src`, etc...) 
    if (event.target.readyState === "complete") {
        alert("hi 2");
    }
});

Gleiches gilt für jQuery:

$(document).ready(function() {   //same as: $(function() { 
     alert("hi 1");
});

$(window).load(function() {
     alert("hi 2");
});





HINWEIS: - Verwenden Sie das folgende Markup nicht (da es andere gleichartige Deklarationen überschreibt):

document.onreadystatechange = ...
T.Todua
quelle
1
wird dieser Cross-Browser unterstützt
Bluejayke
Diese Antwort ist viel besser als die anderen. +1
Xydez
Sehr gut! Vielen Dank.
Farzin Kanzi
34

Wenn Sie jQuery verwenden können, sehen Sie sich load an . Sie können dann festlegen, dass Ihre Funktion ausgeführt wird, nachdem Ihr Element vollständig geladen wurde.

Betrachten Sie beispielsweise eine Seite mit einem einfachen Bild:

<img src="book.png" alt="Book" id="book" />

Der Ereignishandler kann an das Bild gebunden werden:

$('#book').load(function() {
  // Handler for .load() called.
});

Wenn Sie zum Laden alle Elemente im aktuellen Fenster benötigen, können Sie verwenden

$(window).load(function () {
  // run code
});
Jaime Torres
quelle
1
Bindet die jQuery- loadMethode nicht einfach eine Funktion mit Javascript an das Ladeereignis? Wie würde sich das von dem unterscheiden, was das OP bereits tut?
Alex Kalicki
@AlexKalicki AFAIK es wäre nicht anders, außer dass jQuery addEventListenerdie DOM0- onloadEigenschaft möglicherweise eher verwendet als bindet .
Alnitak
@AlexKalicki Ich kann nicht sagen, dass es genau die gleiche Funktionalität verwendet, aber laut Dokumentation stellt jQuery sicher, dass alle Elemente einschließlich Bilder geladen werden, bevor dies ausgelöst wird. Ich würde eher glauben, dass in diesem Fall zusätzliche Logik vorhanden wäre, und ich habe keinen Grund, die Dokumentation nicht zu glauben, obwohl ich nie auf dasselbe Problem gestoßen bin, über das das OP berichtet.
Jaime Torres
4
Ab JQuery v1.8 ist .load veraltet. Quelle
Adonis K. Kakoulidis
1
Beste Lösung aller Zeiten für die Frage.
Roberto Sepúlveda Bravo
29

Ich bin ein bisschen verwirrt darüber, was Sie unter abgeschlossenem Seitenladen, "DOM Load" oder "Content Load" verstehen. In einer HTML-Seite kann das Laden eines Ereignisses nach einem Ereignis vom Typ zwei ausgelöst werden.

  1. DOM-Laden: Damit wird sichergestellt, dass der gesamte geladene DOM-Baum von Anfang bis Ende geladen wird. Stellen Sie jedoch nicht sicher, dass der Referenzinhalt geladen wird. Angenommen, Sie haben Bilder über die imgTags hinzugefügt , sodass dieses Ereignis sicherstellt, dass alle imggeladenen, aber keine Bilder ordnungsgemäß geladen wurden oder nicht. Um dieses Ereignis zu erhalten, sollten Sie folgendermaßen schreiben:

    document.addEventListener('DOMContentLoaded', function() {
       // your code here
    }, false);

    Oder mit jQuery:

    $(document).ready(function(){
    // your code
    });
  2. Nach dem Laden von DOM und Inhalten: Zeigt auch das Laden von DOM und Inhalten an. Dadurch wird sichergestellt, dass nicht nur imgTags, sondern auch alle Bilder oder anderen relativen Inhalte geladen werden. Um dieses Ereignis zu erhalten, sollten Sie folgendermaßen schreiben:

    window.addEventListener('load', function() {...})

    Oder mit jQuery:

    $(window).on('load', function() {
     console.log('All assets are loaded')
    })
Hanif
quelle
2
Dies ist die einzige Antwort hier, die eine Nicht-jQuery-Lösung für das OP mit einer klaren Erklärung bietet
Velojet
@ Hanif DOMContentLoadedEvent Handler scheint nichts für mich zu tun, loadtut es aber .
Brandon Benefield
1
Benötigen die letzten beiden Beispiele keine Semikolons am Ende der Zeilen?
R. Navega
11

Wenn Sie eine js-Funktion auf Ihrer HTML-Seite aufrufen möchten, verwenden Sie das Ereignis onload. Das Onload-Ereignis tritt auf, wenn der Benutzeragent das Laden eines Fensters oder aller Frames in einem FRAMESET abgeschlossen hat. Dieses Attribut kann mit BODY- und FRAMESET-Elementen verwendet werden.

<body onload="callFunction();">
....
</body>
user2361682
quelle
7

Auf diese Weise können Sie beide Fälle behandeln - ob die Seite bereits geladen ist oder nicht:

document.onreadystatechange = function(){
    if (document.readyState === "complete") {
       myFunction();
    }
    else {
       window.onload = function () {
          myFunction();
       };
    };
}
tsveti_iko
quelle
3

Alternativ können Sie es unten versuchen.

$(window).bind("load", function() { 
// code here });

Dies funktioniert in jedem Fall. Dies wird nur ausgelöst, wenn die gesamte Seite geladen ist.

Ganesh Ram Ravi
quelle
3

Soweit ich weiß, ist es am besten, wenn Sie es verwenden

window.addEventListener('load', function() {
    console.log('All assets loaded')
});

Die Antwort Nr. 1 bei der Verwendung des DOMContentLoadedEreignisses ist ein Rückschritt, da das DOM geladen wird, bevor alle Assets geladen werden.

Andere Antworten empfehlen, setTimeoutdie ich stark ablehnen würde, da sie völlig subjektiv für die Geräteleistung und die Netzwerkverbindungsgeschwindigkeit des Clients sind. Wenn sich jemand in einem langsamen Netzwerk befindet und / oder eine langsame CPU hat, kann das Laden einer Seite einige bis Dutzende Sekunden dauern, sodass Sie nicht vorhersagen können, wie viel Zeit setTimeoutbenötigt wird.

Was readystatechange, es feuert , wenn readyStateÄnderungen, die nach MDN noch vor dem seinen loadFall.

Komplett

Der Status zeigt an, dass das Ladeereignis ausgelöst wird.

Ryan Walker
quelle
2
window.onload = () => {
  // run in onload
  setTimeout(() => {
    // onload finished.
    // and execute some code here like stat performance.
  }, 10)
}
tvrcgo
quelle
2
Während dieses Code-Snippet die Lösung sein kann, hilft das Hinzufügen einer Erklärung wirklich, die Qualität Ihres Beitrags zu verbessern. Denken Sie daran, dass Sie die Frage in Zukunft für Leser beantworten und diese Personen möglicherweise die Gründe für Ihren Codevorschlag nicht kennen.
Yivi
@yivi, wenn das keine automatisierte Nachricht ist: Es ist für jeden ziemlich offensichtlich, was dieser Code bedeutet, zumal es Kommentare im Code gibt ..
bluejayke
1

Wenn Sie jQuery bereits verwenden, können Sie Folgendes versuchen:

$(window).bind("load", function() {
   // code here
});
Santosh
quelle
4
Nutzlos ohne Erklärung.
Daniel W.
1

Ich kann Ihnen sagen, dass die beste Antwort darin besteht, direkt nach dem </body>Befehl ein "Treiber" -Skript einzufügen. Es ist die einfachste und wahrscheinlich universellere Lösung als einige der oben genannten Lösungen.

Der Plan: Auf meiner Seite steht eine Tabelle. Ich schreibe die Seite mit der Tabelle in den Browser und sortiere sie dann mit JS. Der Benutzer kann darauf zurückgreifen, indem er auf Spaltenüberschriften klickt.

Nachdem die Tabelle einen </tbody>Befehl beendet und der Text beendet hat, rufe ich in der folgenden Zeile das Sortier-JS auf, um die Tabelle nach Spalte 3 zu sortieren. Ich habe das Sortierskript aus dem Web entfernt, damit es hier nicht reproduziert wird. Zumindest für das nächste Jahr können Sie dies in Betrieb sehen, einschließlich des JS unter static29.ILikeTheInternet.com. Klicken Sie unten auf der Seite auf "hier". Daraufhin wird eine weitere Seite mit der Tabelle und den Skripten angezeigt. Sie können sehen, dass die Daten gespeichert und dann schnell sortiert werden. Ich muss es etwas beschleunigen, aber die Grundlagen sind jetzt da.

</tbody></body><script type='text/javascript'>sortNum(3);</script></html>

MakerMikey

Micheal Morrow
quelle
0

Versuchen Sie diese jQuery :

$(function() {
 // Handler for .ready() called.
});
djserva
quelle
1
jQuery's readywird nicht das tun, was das OP angefordert hat. readyWird ausgelöst, wenn das DOM geladen wird, nicht nachdem Elemente geladen wurden. loadwird ausgelöst, nachdem die Elemente geladen / gerendert wurden.
Jaime Torres
0

Rufen Sie eine Funktion auf, nachdem das Zeitlimit für das vollständige Laden der Seite vollständig eingestellt wurde

setTimeout(function() {
   var val = $('.GridStyle tr:nth-child(2) td:nth-child(4)').text();
	for(var i, j = 0; i = ddl2.options[j]; j++) {
		if(i.text == val) {      
			ddl2.selectedIndex = i.index;
			break;
		}
	} 
}, 1000);

MH
quelle
0

Ich neige dazu, das folgende Muster zu verwenden, um zu überprüfen, ob das Dokument vollständig geladen ist. Die Funktion gibt ein Versprechen zurück (wenn Sie IE unterstützen müssen, fügen Sie die Polyfüllung hinzu ), das aufgelöst wird, sobald das Laden des Dokuments abgeschlossen ist. Es wird setIntervaldarunter verwendet, da eine ähnliche Implementierung mit setTimeoutzu einem sehr tiefen Stapel führen kann.

function getDocReadyPromise()
{
  function promiseDocReady(resolve)
  {
    function checkDocReady()
    {
      if (document.readyState === "complete")
      {
        clearInterval(intervalDocReady);
        resolve();
      }
    }
    var intervalDocReady = setInterval(checkDocReady, 10);
  }
  return new Promise(promiseDocReady);
}

Wenn Sie den IE nicht unterstützen müssen:

const getDocReadyPromise = () =>
{
  const promiseDocReady = (resolve) =>
  {
    const checkDocReady = () =>
      ((document.readyState === "complete") && (clearInterval(intervalDocReady) || resolve()));
    let intervalDocReady = setInterval(checkDocReady, 10);
  }
  return new Promise(promiseDocReady);
}

Mit dieser Funktion können Sie Folgendes tun:

getDocReadyPromise().then(whatIveBeenWaitingToDo);
Paul Rowe
quelle
-1

Ich verwende Webkomponenten, damit das für mich funktioniert:

document.addEventListener('WebComponentsReady', function() {
       document.querySelector('your-element').show();
});
Ufukomer
quelle
-3

Fügen Sie Ihr Skript nach Abschluss des Body-Tags ein ... es funktioniert ...

Kalyan
quelle