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
deferSkripte nicht mehr in der richtigen Reihenfolge ausgeführt werden.
- Einige Browser verzögern das
DOMContentLoadedEreignis, bis die deferSkripte geladen wurden, andere nicht.
- Einige Browser gehorchen
deferauf <script>Elemente mit Inline - Code und ohne srcAttribut, 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 DOMContentLoadedoder verwenden Sie die praktische .ready()Funktion von jQuery . Sie sollten dies trotzdem tun, um auf Browser zurückzugreifen, die überhaupt nicht implementiert sind defer.)