Code innerhalb DOMContentLoaded-Ereignis nicht funktioniert
Habe ich verwendet
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
</head>
<body>
<button type="button" id="button">Click</button>
<pre id="output">Not Loading...</pre>
<script src="https://cdnjs.cloudflare.com/ajax/libs/babel-standalone/6.17.0/babel.min.js"></script>
<script type="text/babel">
document.addEventListener('DOMContentLoaded', function () {
const button = document.getElementById('button');
const output = document.getElementById('output');
output.textContent = 'Loading...';
addEventListener('click', function () {
output.textContent = 'Done';
});
});
</script>
</body>
</html>
aber es scheint der code innerhalb document.addEventListener('DOMContentLoaded', function () {});
ist nicht geladen.
Wenn ich zu entfernen dieses aus meinem code, es plötzlich funktioniert.
Ich habe eine JS Bin hier.
FWIW, es gibt überhaupt keine Notwendigkeit für die Verwendung von
Warum fügen Sie
Dies ist nur ein Beispiel. In meinen anderen scripts, ich bin mit Pfeil-Funktionen, so dass ich babel zu konvertieren, die es von ES6 nach ES5
Aber wenn ich es entfernen, code hat funktioniert.
Die OP ist über Babel Standalone zu verwenden Babel ist transpiling im den browser. Das ist, wie Sie sagen, "Babel " Standalone", welche Skripte es sollte transpile.
DOMContentLoaded
. Das Skript ist bereits am Ende des Dokuments, die ist ausreichend gut genug.Warum fügen Sie
text/babel
geben Sie Ihrem Skript?Dies ist nur ein Beispiel. In meinen anderen scripts, ich bin mit Pfeil-Funktionen, so dass ich babel zu konvertieren, die es von ES6 nach ES5
Aber wenn ich es entfernen, code hat funktioniert.
Die OP ist über Babel Standalone zu verwenden Babel ist transpiling im den browser. Das ist, wie Sie sagen, "Babel " Standalone", welche Skripte es sollte transpile.
InformationsquelleAutor Jamgreen | 2016-10-12
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es ist wahrscheinlich, weil die
DOMContentLoaded
Veranstaltung war bereits abgefeuert an dieser Stelle. Beste Praxis im Allgemeinen ist zu prüfen, für Dokument.readyState, um zu bestimmen, ob oder nicht, müssen Sie einen Listener für dieses Ereignis überhaupt.Ha, ja, ich denke, das ist so ziemlich der standard in vanilla JS heutzutage.
Naja, ich denke, dass der standard-Weg zu gehen, nur um sicherzustellen, dass die
script
ist am Ende des Körpers und nicht Aufhebens mitDOMContentLoaded
. Es ist nur code, wo der Autor hat keine Kontrolle darüber, wo der script-tag wird gehen, müssen diese (wie lustig, Babel Standalone).Ist, so T. J.? Wenn Ihr Skript-block wird an das Ende des Körpers, es kann nie kollidieren mit "andere Sachen" DOMContentLoaded-Uhren mehr?
Überprüfen Sie nicht für
document.readyState === 'complete'
! Überprüfen Sie fürdocument.readyState !== 'loading'
, weil es nutzlos ist zu hören, fürDOMContentLoaded
wenndocument.readyState
ist "interaktiv". Testen Sie Ihre Fehler und korrigieren Sie den code.InformationsquelleAutor jAndy
Die Veranstaltung hat bereits ausgelöst durch die Zeit, die code hooks. Der Weg Babel standalone arbeitet, ist durch die Reaktion auf
DOMContentLoaded
von der Suche und der Durchführung aller von dertype="text/babel"
Skripts auf der Seite. Sie können dies in derindex.js
- Datei:Führen Sie einfach den code direkt, ohne zu warten, für die Veranstaltung, da Sie wissen, Babel standalone warten es für Sie.
Beachten Sie auch, dass, wenn Sie Ihr Skript am Ende des Körpers, unmittelbar vor dem schließenden
</body>
tag, es gibt keine Notwendigkeit zu warten, fürDOMContentLoaded
auch wenn Sie nicht verwenden Babel. Alle der oben definierten Elemente das Skript vorhanden und werden zur Verfügung, um Ihr Skript.In einem Kommentar, den du gefragt hast:
Nur sicher, dass Ihre
script
- tag ist am Endebody
wie oben beschrieben, und es gibt keine Notwendigkeit zu verwenden die Veranstaltung.Wenn es dir wichtig ist, es trotzdem zu benutzen, können Sie überprüfen, um zu sehen, ob das Ereignis bereits durch die Prüfung
Dokument.readyState
(nachdem Sie den link, scrollen Sie nach oben ein bisschen):document.readyState
geht durch diese Phasen (scrollen Sie etwas nach oben aus dem link oben):Ich habe ein Antwort Kommentar zur Antwort oben.
Sie. ich war irregeführt durch die Skillung zu sagen "Jedes Dokument hat einen aktuellen Dokument Bereitschaft. Wenn ein Dokument-Objekt erstellt wird, muss es seine aktuelle Dokument Bereitschaft gesetzt, um den string "laden", wenn das Dokument ist in Zusammenhang mit einem HTML-parser, einen XML-parser oder XSLT-Prozessor, und der string "komplett" anders. Verschiedene algorithmen beim laden der Seite beeinflussen diesen Wert. Wenn der Wert eingestellt ist, der Benutzer-agent müssen Sie Feuer ein einfaches Ereignis namens " readystatechange an das Document-Objekt.", Sondern nur oben, ist es klar, dass es ist ein Zwischenprodukt
"interactive"
Zustand! 🙂InformationsquelleAutor T.J. Crowder
Dank Ruslan & hier ist der vollständige code-snippet mit dem bequemen trennen von der
DOMContentLoaded
handler, nachdem er verwendet wird.InformationsquelleAutor bob-12345