本当の答えは、あなたは延期を信頼できないからです。
概念上、deferとasyncは次のように異なります。
asyncを使用すると、スクリプトをブロックせずにバックグラウンドでダウンロードできます。次に、ダウンロードが完了すると、レンダリングがブロックされ、そのスクリプトが実行されます。スクリプトが実行されると、レンダリングが再開されます。
deferも同じことを行いますが、ページで指定された順序でスクリプトが実行されること、およびドキュメントの解析が完了した後にスクリプトが実行されることを保証します。そのため、一部のスクリプトはダウンロードを完了してから、後でダウンロードされてその前に表示されるスクリプトを待ちます。
残念ながら、実際には標準的なキャットファイトであるため、deferの定義は仕様ごとに異なり、最新の仕様でさえ有用な保証を提供していません。答えとして、ここと、この問題は、証明、ブラウザは延期異なっ実装します。
- 特定の状況では、一部のブラウザーには、
defer
スクリプトが順不同で実行される原因となるバグがあります。
- 一部のブラウザー
DOMContentLoaded
は、defer
スクリプトが読み込まれるまでイベントを遅延させますが、そうでないブラウザーもあります。
- 一部のブラウザーは、インラインコードがあり、属性がない要素に準拠し
defer
、一部のブラウザーはそれを無視します。<script>
src
幸い、仕様では少なくとも非同期が遅延をオーバーライドすることを指定しています。そのため、すべてのスクリプトを非同期として扱い、次のように幅広いブラウザサポートを取得できます。
<script defer async src="..."></script>
世界中で使用されているブラウザの98%と米国で99%は、このアプローチでブロックを回避します。
(ドキュメントの構文解析が完了するまで待つ必要がある場合は、イベントDOMContentLoaded
イベントをリッスンするか、jQueryの便利な.ready()
関数を使用してください。とにかく、これを実行defer
して、まったく実装されていないブラウザーで適切にフォールバックします。)