Die wirkliche Antwort lautet: Weil Sie nicht aufschieben können.
Im Konzept unterscheiden sich Defer und Async wie folgt:
Mit async kann das Skript im Hintergrund heruntergeladen werden, ohne es zu blockieren. Sobald der Download abgeschlossen ist, wird das Rendern blockiert und das Skript ausgeführt. Das Rendern wird fortgesetzt, wenn das Skript ausgeführt wurde.
defer macht dasselbe, mit Ausnahme der Ansprüche, die garantieren, dass Skripte in der Reihenfolge ausgeführt werden, in der sie auf der Seite angegeben wurden, und dass sie ausgeführt werden, nachdem das Parsen des Dokuments abgeschlossen ist. Einige Skripte werden möglicherweise heruntergeladen, warten dann auf Skripte, die später heruntergeladen wurden, aber vor ihnen angezeigt wurden.
Leider variiert die Definition von Defer aufgrund eines wirklich standardmäßigen Katzenkampfes von Spezifikation zu Spezifikation, und selbst in den neuesten Spezifikationen bietet dies keine nützliche Garantie. Wie die Antworten hier und in diesem Problem zeigen, implementieren Browser die Verzögerung anders:
- In bestimmten Situationen haben einige Browser einen Fehler, der dazu führt, dass
defer
Skripte nicht mehr in der richtigen Reihenfolge ausgeführt werden.
- Einige Browser verzögern das
DOMContentLoaded
Ereignis, bis die defer
Skripte geladen wurden, andere nicht.
- Einige Browser gehorchen
defer
auf <script>
Elemente mit Inline - Code und ohne src
Attribut, und einige ignorieren.
Glücklicherweise gibt die Spezifikation zumindest an, dass asynchrone Überschreibungen verzögert werden. So können Sie alle Skripte als asynchron behandeln und eine breite Palette an Browserunterstützung erhalten, wie folgt:
<script defer async src="..."></script>
98% der weltweit verwendeten Browser und 99% in den USA vermeiden mit diesem Ansatz das Blockieren.
(Wenn Sie warten müssen, bis das Dokument analysiert wurde, hören Sie sich das Ereignis an DOMContentLoaded
oder verwenden Sie die praktische .ready()
Funktion von jQuery . Sie sollten dies trotzdem tun, um auf Browser zurückzugreifen, die überhaupt nicht implementiert sind defer
.)