Reines JavaScript-Äquivalent von jQuery's $.ready() - wie man eine Funktion aufruft, wenn die Seite/DOM bereit dafür ist
Okay, dies könnte nur eine dumme Frage sein, obwohl ich bin sicher, es gibt viele andere Menschen, die die gleiche Frage von Zeit zu Zeit. Ich, ich möchte nur 100% sicher über es so oder so zu machen. Mit jQuery kennen wir alle die wunderbare
$('document').ready(function(){});
Angenommen, ich möchte eine Funktion ausführen, die in Standard-JavaScript geschrieben ist, ohne dass sie von einer Bibliothek unterstützt wird, und ich möchte eine Funktion starten, sobald die Seite bereit ist, sie zu verarbeiten. Was ist der richtige Weg, um dies zu tun?
Ich weiß, dass ich das kann:
window.onload="myFunction()";
...oder ich kann den "body"-Tag verwenden:
<body onload="myFunction()">
...oder ich kann sogar versuchen, am Ende der Seite nach allem, aber dem Ende des body
oder html
Tags wie:
<script type="text/javascript">
myFunction();
</script>
Was ist eine Cross-Browser (alt/neu) konforme Methode, um eine oder mehrere Funktionen in einer Art und Weise wie jQuery's $.ready()
auszuführen?
In Ermangelung eines Frameworks, das die Cross-Browser-Kompatibilität für Sie übernimmt, ist es am einfachsten, am Ende des Body einen Aufruf an Ihren Code zu setzen. Dies ist schneller als ein "onload"-Handler, da dieser nur darauf wartet, dass das DOM bereit ist, und nicht darauf, dass alle Bilder geladen werden. Außerdem funktioniert dies in jedem Browser.
Für moderne Browser (alles ab IE9 und neuer und jede Version von Chrome, Firefox oder Safari), wenn Sie in der Lage sein wollen, eine jQuery-ähnliche
$(document).ready()
-Methode zu implementieren, die Sie von überall aus aufrufen können (ohne sich Gedanken darüber zu machen, wo das aufrufende Skript positioniert ist), können Sie einfach etwas wie dieses verwenden:Verwendung:
Wenn Sie volle Cross-Browser-Kompatibilität benötigen (einschließlich alter IE-Versionen) und nicht auf
window.onload
warten wollen, dann sollten Sie sich ansehen, wie ein Framework wie jQuery seine Methode$(document).ready()
implementiert. Das ist ziemlich kompliziert und hängt von den Fähigkeiten des Browsers ab.Um Ihnen eine kleine Vorstellung davon zu geben, was jQuery tut (was überall funktioniert, wo das Skript-Tag platziert ist).
Wenn es unterstützt wird, versucht es den Standard:
mit einem Fallback zu:
oder für ältere Versionen des IE, verwendet es:
mit einem Fallback zu:
Und es gibt einige Workarounds im IE-Codepfad, denen ich nicht ganz folgen kann, aber es sieht so aus, als hätte es etwas mit Frames zu tun.
Hier ist ein vollständiger Ersatz für jQuery's
.ready()
geschrieben in plain javascript:Die neueste Version des Codes ist öffentlich auf GitHub unter https://github.com/jfriend00/docReady verfügbar.
Verwendung:
Dies wurde getestet in:
Arbeitsimplementierung und Prüfstand: http://jsfiddle.net/jfriend00/YfD3C/
Hier ist eine Zusammenfassung, wie es funktioniert:
docReady(fn, context)
docReady(fn, context)
aufgerufen wird, prüfen Sie, ob der ready handler bereits ausgelöst wurde. Wenn ja, planen Sie einfach den neu hinzugefügten Callback so, dass er direkt nach Beendigung dieses Threads von JS mitsetTimeout(fn, 1)
ausgelöst wird.document.addEventListener
existiert, dann installiere Ereignis-Handler mit.addEventListener()
für beide"DOMContentLoaded"
und"load"
Ereignisse. Das "load"-Ereignis ist ein Backup-Ereignis zur Sicherheit und sollte nicht benötigt werden.document.addEventListener
nicht existiert, dann installieren Sie Event-Handler mit.attachEvent()
für"onreadystatechange"
und"onload"
Events.onreadystatechange
-Ereignis prüfen, ob derdocument.readyState === "complete"
ist und wenn ja, eine Funktion aufrufen, um alle ready-Handler auszulösen.Handler, die mit
docReady()
registriert wurden, werden garantiert in der Reihenfolge abgefeuert, in der sie registriert wurden.Wenn Sie
docReady(fn)
aufrufen, nachdem das Dokument bereits fertig ist, wird der Callback so geplant, dass er ausgeführt wird, sobald der aktuelle Thread der Ausführung mitsetTimeout(fn, 1)
beendet ist. Dies erlaubt es dem aufrufenden Code, immer davon auszugehen, dass es sich um asynchrone Rückrufe handelt, die später aufgerufen werden, auch wenn später ist, sobald der aktuelle Thread von JS beendet ist, und es bewahrt die Aufrufreihenfolge.Ihre Methode (Platzierung des Skripts vor dem schließenden Body-Tag)
ist eine zuverlässige Methode, um alte und neue Browser zu unterstützen.
Die Option
document.ondomcontentready=function(){}
sollte ausreichen, ist aber nicht vollständig browserfähig.Scheint, als sollten Sie nur jQuery min verwenden