Ich möchte den folgenden JavaScript-Code mit beiden defer
und laden async
:
<script defer async src="/js/somescript.js"></script>
Da defer
Internet Explorer 5.5+ unterstützt wird, wie Sie auf CanIUse.com sehen können , möchte ich auf die Verwendung von Defer zurückgreifen , wenn Async nicht verfügbar ist. Async ist meiner Meinung nach besser zu verwenden, wenn es verfügbar ist, wird aber erst mit Internet Explorer 10 unterstützt.
Meine Frage ist daher, ob der obige Code gültiges HTML ist. Wenn nicht, ist es möglich, diese Situation mit JavaScript zu erstellen und auf die Verwendung defer
in einem Skript zurückzugreifen, wenn async
es nicht verfügbar ist?
quelle
async
defer
existieren, moderne Browser laufen wieasync
; 2.Beideasync
defer
existieren, alte Browser laufen wiedefer
anstelle vondefault
Verhaltenasync
zudefer
. Und ein Ja zu @vikyd. Wenn Sie sich nur nicht um das Erbe kümmern, möchten Sie niemals beide auf einem haben<script>
.Die Frage ist, was würden Sie davon erwarten? Wenn beide async und defer vorhanden sind , würde ich das Skript erwartet verschoben werden und erst nach DOMContentLoaded ausgeführt , wenn der Browser im Leerlauf ist, aber wenn ich die Spezifikation richtig gerade lese es sieht aus wie defer ignoriert, wenn async gesetzt wird und das Skript geladen asynchron, wird also ausgeführt, sobald es verfügbar ist. Dies kann durchaus vor DOMContentLoaded liegen und andere Ressourcen blockieren.
https://www.w3.org/TR/2011/WD-html5-20110525/scripting-1.html#attr-script-async
quelle
Wird leider
defer
ignoriert, wennasync
angegeben, und hatasync
immer eine höhere Priorität. (Zumindest in Chrome. Ehrlich gesagt, nicht in anderen Browsern getestet, aber ich denke, dass das Ergebnis das gleiche sein wird.)Und ich persönlich finde es sehr schlimm, dass
defer
es ignoriert wird. Stellen wir uns eine Situation vor, in der JS so schnell wie möglich initialisiert werden soll, noch bevor der Seiteninhalt geladen wird. Wir möchten jedoch, dass dieses Skript VOR den restlichen Skripten initialisiert wird, für die dies erforderlich ist. Es sollte zuerst in derdefer
Warteschlange stehen. Aber das wird leider nicht funktionieren:<!-- we want "jQuery" ASAP and still in "defer" queue. But defer is ignored. --> <script src="jquery.min.js" async defer></script> <!-- this doesn't blocks the content and can wait the full page load, but requires "jQuery" --> <script src="some_jquery_plugin.min.js" defer></script>
In diesem Beispiel kann "some_jquery_plugin.min.js" vor dem Laden von jQuery geladen und ausgeführt werden und schlägt fehl. :(
Es gibt also zwei Möglichkeiten, um das Problem zu lösen: Verwenden Sie entweder nur die
defer
Direktive oder führen Sie alle abhängigen Javascript-Dateien zu einem einzigen JS zusammen.quelle
Ja, es ist gültiges HTML und es wird wie erwartet funktionieren.
Jeder W3C-kompatible Browser erkennt das asynchrone Attribut und behandelt das Skript ordnungsgemäß, während ältere IE- Versionen das verzögerte Attribut erkennen.
Da beide Attribute sind boolean nicht wahr haben einen Wert zuweisen.
quelle