Was genau ist der Unterschied zwischen dem window.onload
Ereignis und dem onload
Ereignis des body
Tags? Wann verwende ich welche und wie soll es richtig gemacht werden?
javascript
Manu
quelle
quelle
Antworten:
window.onload = myOnloadFunc
und<body onload="myOnloadFunc();">
sind verschiedene Möglichkeiten, dasselbe Ereignis zu verwenden . Die Verwendungwindow.onload
ist jedoch weniger aufdringlich - sie entfernt Ihr JavaScript aus dem HTML-Code.Alle gängigen JavaScript-Bibliotheken, Prototype, ExtJS, Dojo, JQuery, YUI usw. bieten nützliche Wrapper für Ereignisse, die beim Laden des Dokuments auftreten. Sie können auf das Fenster onLoad-Ereignis warten und darauf reagieren, aber onLoad wird erst ausgelöst, wenn alle Ressourcen heruntergeladen wurden, sodass Ihr Ereignishandler erst ausgeführt wird, wenn das letzte große Bild abgerufen wurde. In einigen Fällen ist dies genau das, was Sie möchten. In anderen Fällen ist es möglicherweise angemessener, darauf zu achten, wann das DOM bereit ist. Dieses Ereignis ähnelt onLoad, wird jedoch ausgelöst, ohne auf das Herunterladen von Bildern usw. zu warten.
quelle
myOnloadFunc()
im globalen Kontext aufgerufen (this
siehewindow
). Wenn Sie es über Javascript einstellen, wird es im Kontext des Elements ausgeführt (this
bezieht sich auf das Element, für das das Ereignis ausgelöst wurde). In diesem speziellen Fall macht es keinen Unterschied, aber bei anderen Elementen.this
auf das bei Bedarf verwiesen wird .Es gibt keinen Unterschied, aber Sie sollten auch nicht verwenden.
In vielen Browsern wird das
window.onload
Ereignis erst ausgelöst, wenn alle Bilder geladen wurden. Dies ist nicht das, was Sie möchten. Auf Standards basierende Browser haben ein Ereignis namens,DOMContentLoaded
das früher ausgelöst wird, aber vom IE nicht unterstützt wird (zum Zeitpunkt des Schreibens dieser Antwort). Ich würde empfehlen, eine Javascript-Bibliothek zu verwenden, die eine browserübergreifende DOMContentLoaded-Funktion unterstützt, oder eine gut geschriebene Funktion zu finden, die Sie verwenden können. jQuery's$(document).ready()
ist ein gutes Beispiel.quelle
window.onload
kann ohne Körper arbeiten. Erstellen Sie eine Seite nur mit den Skript-Tags und öffnen Sie sie in einem Browser. Die Seite enthält keinen Text, funktioniert aber trotzdem.quelle
<!ELEMENT html (head, body)>
[1] an - und html401 gibt auch<!ELEMENT HTML O O (%html.content;)
mit<!ENTITY % html.content "HEAD, BODY">
[2] an. html51 gibt auchA head element followed by a body element.
für HTML-Inhalte an. [3] w3.org/TR/xhtml1/dtds.html#a_dtd_XHTML-1.0-Strict w3.org/TR/xhtml1/dtds.html#a_dtd_XHTML-1.0-Strict w3.org/TR/html51/semantics.html#the -html-Element - Also habe ich alle diese gemeinsamen / in-use HTML - Standards erraten tun einen Body - Tag erfordern. :)Start tag: optional, End tag: optional
Im Allgemeinen bevorzuge ich es, das Ereignis> nicht zu verwenden
<body onload=""
. Ich denke, es ist sauberer, das Verhalten so weit wie möglich vom Inhalt zu trennen.Das heißt, es gibt Fälle (normalerweise ziemlich selten für mich), in denen die Verwendung von Körperlast einen leichten Geschwindigkeitsschub bewirken kann.
Ich verwende gerne Prototype, daher füge ich im Allgemeinen so etwas in das
<head
> meiner Seite ein:oder
Das Obige sind Tricks, die ich hier gelernt habe . Ich mag das Konzept des Anhängens von Ereignishandlern außerhalb des HTML-Codes sehr.
(Bearbeiten, um Rechtschreibfehler im Code zu korrigieren.)
quelle
'so viele subjektive Antworten auf eine objektive Frage. "Unauffälliges" JavaScript ist Aberglaube wie die alte Regel, niemals Gotos zu verwenden. Schreiben Sie Code so, dass Sie Ihr Ziel zuverlässig erreichen können, nicht gemäß den trendigen religiösen Überzeugungen einer Person.
Wer findet:
übermäßig abzulenken ist übermäßig anmaßend und hat keine klaren Prioritäten.
Normalerweise füge ich meinen JavaScript-Code in eine separate .js-Datei ein, aber ich finde es nicht umständlich, Ereignishandler in HTML einzubinden, was übrigens gültiges HTML ist.
quelle
window.onload
- Wird aufgerufen, nachdem alle DOM-, JS-Dateien, Bilder, Iframes, Erweiterungen und andere vollständig geladen wurden. Dies entspricht $ (Fenster) .load (Funktion () {});body onload=""
- Wird aufgerufen, sobald DOM geladen ist. Dies ist gleich $ (document) .ready (function () {});quelle
ready
vs-onload
Ereignisse bezeichnet.load
wird ausgelöst, nachdem das gesamte Dokument einschließlich aller Skripte, Bilder und Stylesheets geladen wurde.DOMContentLoaded
wird ausgelöst, nachdem der DOM-Baum erstellt wurde, aber vor Bildern usw. DiesDOMContentLoaded
entsprichtdocument.ready
nicht demload
.Es gibt keinen Unterschied ...
Sie können also hauptsächlich beide verwenden (einzeln! -)
Aber aus Gründen der Lesbarkeit und der Sauberkeit des HTML-Codes bevorzuge ich immer das window.onload! O]
quelle
Wenn Sie versuchen, unauffälligen JS-Code zu schreiben (und das sollten Sie auch sein), sollten Sie ihn nicht verwenden
<body onload="">
.Nach meinem Verständnis behandeln verschiedene Browser diese beiden etwas unterschiedlich, funktionieren jedoch ähnlich. Wenn Sie in den meisten Browsern beide definieren, wird einer ignoriert.
quelle
Stellen Sie sich Onload wie jedes andere Attribut vor. In ein Eingabefeld könnten Sie beispielsweise Folgendes einfügen:
Oder Sie könnten anrufen:
Das Attribut onload funktioniert auf die gleiche Weise, außer dass eine Funktion anstelle einer Zeichenfolge als Wert verwendet wird, wie dies das Attribut value tut. Dies erklärt auch, warum Sie "nur einen von ihnen verwenden können" - wenn Sie window.onload aufrufen, wird der Wert des onload-Attributs für das body-Tag neu zugewiesen.
Wie andere hier sagen, ist es normalerweise sauberer, Stil und Javascript vom Inhalt der Seite zu trennen, weshalb die meisten Leute empfehlen, window.onload zu verwenden oder die Ready-Funktion von jQuery zu mögen.
quelle
<body onload = ""> sollte window.onload überschreiben.
Mit <body onload = ""> kann document.body.onload je nach Browser null, undefiniert oder eine Funktion sein (obwohl getAttribute ("onload") etwas konsistent sein sollte, um den Body der anonymen Funktion als Zeichenfolge abzurufen). . Wenn Sie mit window.onload eine Funktion zuweisen, ist window.onload eine Funktion, die über alle Browser hinweg konsistent ist. Wenn Ihnen das wichtig ist, verwenden Sie window.onload.
window.onload ist sowieso besser, um das JS von Ihrem Inhalt zu trennen. Es gibt sowieso nicht viel Grund, <body onload = ""> zu verwenden, wenn Sie window.onload verwenden können.
In Opera ist das Ereignisziel für window.onload und <body onload = ""> (und sogar window.addEventListener ("load", func, false)) das Fenster anstelle des Dokuments wie in Safari und Firefox. "Dies" ist jedoch das Fenster zwischen den Browsern.
Dies bedeutet, dass Sie, wenn es darauf ankommt, den Rohstoff einwickeln und die Dinge konsistent machen oder eine Bibliothek verwenden sollten, die dies für Sie erledigt.
quelle
Sie arbeiten beide gleich. Beachten Sie jedoch, dass nur einer von beiden aufgerufen wird, wenn beide definiert sind. Ich vermeide es im Allgemeinen, einen von ihnen direkt zu verwenden. Stattdessen können Sie dem Ladeereignis einen Ereignishandler hinzufügen. Auf diese Weise können Sie andere JS-Pakete einfacher integrieren, die möglicherweise auch einen Rückruf an das Onload-Ereignis anhängen müssen.
Jedes JS-Framework verfügt über browserübergreifende Methoden für Ereignishandler.
quelle
Es ist ein anerkannter Standard, Inhalt, Layout und Verhalten getrennt zu haben. Daher ist window.onload () besser geeignet, als
<body onload="">
wenn beide die gleiche Arbeit erledigen.quelle
Tut mir leid, dass ich diesen Thread nach weiteren 3 Jahren Schlaf wiedergeboren habe, aber vielleicht habe ich endlich den unbestreitbaren Vorteil von
window.onload=fn1;
over gefunden<body onload="fn1()">
. Es handelt sich um die JS Module oder ES - Module : Wenn Ihronload
Handler besteht in „klassischen“ JS - Datei (dh ohne bezeichnet<script type="module" … >
, so oder so ist möglich, wenn deronload
Handler besteht in „Modul“ JS - Datei (dh mit bezeichnet<script type="module" … >
, die<body onload="fn1()">
fehl mit „fn1 () ist nicht definiert "Fehler. Der Grund ist vielleicht, dass die ES-Module nicht geladen werden, bevor HTML analysiert wird ... aber es ist nur meine Vermutung. Wie auch immer,window.onload=fn1;
funktioniert perfekt mit Modulen ...quelle