Können Sie sowohl das async und defer Attribute für einen HTML-script-tag?
Ich würde gerne laden Sie in den folgenden JavaScript-code mit beiden defer
und async
:
<script defer async src="/js/somescript.js"></script>
Seit defer
wird unterstützt von Internet Explorer 5.5+, wie man an CanIUse.com, ich möchte anmutig fallback zu verwenden aufschieben, wenn async ist nicht verfügbar. Async-ich denke, besser ist zu verwenden, wenn es verfügbar ist, aber nicht unterstützt, bis Internet Explorer 10.
Meine Frage ist daher ist der obige code Valide HTML? Wenn nicht, ist es möglich, diese situation mit Hilfe von JavaScript, die anmutig fallen wieder auf die Verwendung defer
auf ein Skript, wenn async
ist nicht verfügbar?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Aus der Spezifikation: https://www.w3.org/TR/2011/WD-html5-20110525/scripting-1.html#attr-script-async
async
defer
vorhanden, modernen Browsern laufen alsasync
; 2.beideasync
defer
vorhanden, alte Browser laufen alsdefer
stattdefault
Verhaltenasync
zudefer
. Und ja @vikyd. Wenn Sie nur kümmern sich nicht um das Erbe, Sie wollen nie beide auf der gleichen<script>
.Die Frage ist, was würde Sie erwarten, es zu tun?
Wenn beide async und aufschieben vorhanden sind, würde ich erwarten, dass das script verschoben werden und erst ausgeführt, nachdem DOMContentLoaded, wenn der browser im Leerlauf, aber wenn ich bin das Lesen der Spezifikation Recht, es sieht aus wie aufschieben wird ignoriert, wenn async gesetzt und das Skript wird asynchron geladen, so wird ausgeführt, sobald es verfügbar ist, das kann gut sein, vor dem DOMContentLoaded und blockiert möglicherweise andere Ressourcen.
https://www.w3.org/TR/2011/WD-html5-20110525/scripting-1.html#attr-script-async
Ja, die gültigen HTML-Code und funktioniert wie erwartet.
Beliebigen W3C-konformen browser erkennen die async Attribut und behandeln das Skript richtig, in der Erwägung, dass legacy IE Versionen erkennen die aufschieben Attribut.
Da beide Attribute sind boolean Sie nicht müssen weisen einen beliebigen Wert.
Leider
defer
wird ignoriert, wennasync
angegeben, undasync
haben immer eine höhere Priorität. (Zumindest in Chrome. Ehrlich gesagt, habe nicht getestet die in anderen Browsern, aber ich denke, das Ergebnis wird dasselbe sein.)Und ich persönlich denke, dass es sehr schlimm, dass
defer
ignoriert. Stellen wir uns die situation, wenn wir würden gerne einige JS initialisiert, so schnell wie möglich, noch vor dem laden der Inhalte auf der Seite. Aber wir wollen dieses Skript initialisiert ist, BEVOR der rest des Skripts, die es erfordert. Es sollte zunächst indefer
Warteschlange. Aber, leider, das wird nicht funktionieren:In diesem Beispiel wird "some_jquery_plugin.min.js" geladen und ausgeführt werden kann, bevor der Ladevorgang von jQuery, und schlägt fehl. 🙁
Also es gibt 2 Wege das problem zu lösen: entweder verwenden Sie nur
defer
Richtlinie oder merge-je nach javascript-Dateien in eine einzige JS.