Comment fonctionne exactement <script defer=“defer”> travail?
J'ai un peu de <script>
éléments, et le code dans certains d'entre eux dépendent de code dans d'autres <script>
éléments. J'ai vu le defer
attribut peut s'avérer très pratique ici, car il permet de blocs de code pour le report de l'exécution.
Pour le tester j'ai exécuté ce sur Chrome: http://jsfiddle.net/xXZMN/.
<script defer="defer">alert(2);</script>
<script>alert(1)</script>
<script defer="defer">alert(3);</script>
Cependant, il avertit 2 - 1 - 3
. Pourquoi n'est-il pas d'alerte 1 - 2 - 3
?
- Peut-être découvrez cet article. Et, comme toujours, c'est à dire a leur propre ce qui signifie quelque chose et a décidé de charger le script, mais le retard de l'exécution jusqu'à ce que le corps est chargé (généralement).
- Merci, cependant la page de test a un résultat différent sur Chrome: websiteoptimization.com/speed/tweak/defer/test. La capture d'écran montre comment je pourrais l'attendre, tandis que google Chrome, il semble exécuter le report de la première.
- Je pense que vous trouverez les IE définition de reporter les matchs de la W3C intention de reporter dans le DOM Niveau 1 spec.
- Comme Alohci l'a déjà souligné, dans sa réponse, selon le Standard HTML
defer
est valide seulement lors de la spécification desrc
. Cela pourrait être une raison pourquoi votre exemple ne fonctionne pas comme prévu dans la plupart des navigateurs. - Histoire vraie! Essayez de jsfiddle.net/xXZMN/50 Testé dans Firefox24
- Trouve ce schéma très utile pour comprendre reporter et les différences entre async et de reporter: growingwiththeweb.com/2014/02/async-vs-defer-attributes.html
Vous devez vous connecter pour publier un commentaire.
Mise à JOUR: 2/19/2016
Considérer cette réponse obsolètes. Se référer à d'autres réponses sur ce post pour obtenir des renseignements pertinents à la plus récente version du navigateur.
Fondamentalement, reporter indique au navigateur d'attente "jusqu'à ce qu'il est prêt" avant d'exécuter le code javascript dans un bloc de script. Généralement c'est après le DOM a fini de charger et de document.readyState == 4
L'attribut defer est spécifique à internet explorer. Dans Internet Explorer 8 sur Windows 7 le résultat que je vois dans votre JS Fiddle page de test est, 1 - 2 - 3.
Les résultats peuvent varier d'un navigateur à l'autre.
http://msdn.microsoft.com/en-us/library/ms533719(v=vs. 85).aspx
Contrairement à la croyance populaire IE suit des normes plus souvent que les gens laissent sur, en réalité, le "reporter" de l'attribut est défini dans le DOM Niveau 1 spec http://www.w3.org/TR/REC-DOM-Level-1/level-one-html.html
Le W3C définition de reporter: http://www.w3.org/TR/REC-html40/interact/scripts.html#adef-defer:
"Lorsqu'elle est réglée, cet attribut booléen indique à l'agent utilisateur que le script ne va pas générer de tout document contenu (par exemple, pas de "document.écrire" en javascript) et donc, l'agent utilisateur peut continuer d'analyse et de rendu."
Quelques extraits de la spec HTML5: http://w3c.github.io/html/semantics-scripting.html#element-attrdef-script-async
defer
mal. Si vous utilisezdefer
, vous ne pouvez pas compter sur les fichiers de script en cours d'exécution dans l'ordre dans certains navigateurs.La vraie réponse est: Parce que vous ne pouvez faire confiance à reporter.
Dans le concept, reporter et asynchrone se distinguent comme suit:
async permet le script pour être téléchargé en arrière-plan sans blocage. Puis, le moment de la fin de son téléchargement, le rendu est bloqué et que le script s'exécute. Rendre reprend lorsque le script est exécuté.
reporter fait la même chose, à l'exception des allégations de garantir que les scripts s'exécutent dans l'ordre qu'ils ont été spécifiés sur la page, et qu'ils seront exécutés après que le document a terminé l'analyse. Ainsi, certains de ces scripts peut terminer le téléchargement, puis s'asseoir et d'attendre pour les scripts téléchargés plus tard mais a comparu devant eux.
Malheureusement, en raison de ce qui est vraiment un combat de chat, de reporter à la définition varie spec spec, et même dans les plus récentes spécifications n'offre pas utile de garantie. En tant que réponses ici et ce problème démontrer, mettre en œuvre les navigateurs reporter différemment:
defer
l'exécution de scripts de commande.DOMContentLoaded
, jusqu'à ce que après ladefer
scripts ont chargé, et certains ne le font pas.defer
sur<script>
éléments avec le code en ligne et sanssrc
attribut, et certains l'ignorer.Heureusement, la spécification ne fait au moins préciser que async remplace reporter. Vous pouvez donc traiter tous les scripts que async et obtenir une large bande de support de navigateur comme suit:
98% des navigateurs utilisés dans le monde entier et 99% aux états-unis permet d'éviter le blocage avec cette approche.
(Si vous avez besoin d'attendre jusqu'à ce que le document a fini d'analyser, d'écouter l'événement
DOMContentLoaded
de l'événement ou de l'utilisation de jQuery pratique.ready()
fonction. Vous voulez le faire de toute façon à retomber gracieusement sur les navigateurs n'implémentent pasdefer
à tous.)defer
attribut depuis version 15, qui a été publié sur le 2 juin, 2013.defer
async
ensemble? ne devrions-nous utiliser async ou de différer? Veuillez préciser 🙂defer
ne peut être utilisé dans<script>
balise pour script externe l'inclusion. Par conséquent, il est conseillé d'être utilisé dans le<script>
-tags dans le<head>
-section.Comme attribut defer fonctionne uniquement avec les scripts de la balise avec le src. Trouvé un moyen pour imiter reporter pour les scripts. L'utilisation de l'événement DOMContentLoaded.
C'est parce que, DOMContentLoaded événement se déclenche après différer attribué scripts sont complètement chargées.
L'attribut defer est seulement pour les scripts externes (doit être utilisé uniquement si l'attribut src est présent).
Convient également de noter qu'il pourrait y avoir des problèmes dans IE<=9 lors de l'utilisation de
script defer
dans certaines situations. En savoir plus sur cette: https://github.com/h5bp/lazyweb-requests/issues/42Ont un coup d'oeil à cet excellent article Plongée dans les eaux troubles de script de chargement par le Google developer Jake Archibald écrit en 2013.
Citant la section pertinente de l'article:
(je vais ajouter que les premières versions de Firefox déclencher DOMContentLoaded avant la
defer
scripts de fin de l'exécution, selon ce commentaire.)Les navigateurs modernes semblent appuyer
async
correctement, mais vous devez être OK avec les scripts en cours d'exécution hors de l'ordre et peut-être avant DOMContentLoaded.Cet attribut Booléen est défini pour indiquer au navigateur que le script est destiné à être exécuté après que le document a été analysé. Depuis cette fonctionnalité n'a pas encore été mis en œuvre par tous les autres grands navigateurs, les auteurs ne devraient pas présumer que le script d'exécution du fait d'être reporté. Ne jamais appeler document.write() à partir d'un reporter de script (depuis Gecko 1.9.2, cela va souffler le document). L'attribut defer ne doit pas être utilisé sur des scripts qui n'ont pas l'attribut src. Depuis Gecko 1.9.2, le reporter de l'attribut est ignoré sur des scripts qui n'ont pas l'attribut src. Cependant, dans Gecko 1.9.1 même inline scripts sont reportés si l'attribut defer est réglé.
reporter fonctionne avec chrome , firefox , ie > 7 et Safari
ref: https://developer.mozilla.org/en-US/docs/HTML/Element/script
Le reporter de l'attribut est un attribut booléen.
Lorsqu'il est présent, il indique que le script est exécuté quand la page a fini de l'analyse.
Remarque: L'attribut defer est seulement pour les scripts externes (doit être utilisé uniquement si l'attribut src est présent).
Remarque: Il existe plusieurs façons un script externe peut être exécutée:
Si async est présent: Le script est exécuté de manière asynchrone avec le reste de la page (le script sera exécuté alors que la page continue de l'analyse)
Si asynchrone n'est pas présent et de reporter est présent: Le script est exécuté quand la page a fini de l'analyse
Si ni async ou reporter est présent: Le script est téléchargée et exécutée immédiatement, avant que le navigateur continue l'analyse de la page