214 votes

Comment cela fonctionne-t-il exactement ?

J’ai un peu éléments et le code dans certains d'entre eux dépendent du code dans d’autres éléments. J’ai vu le `` attribut peut venir ici très pratique car elle permet des blocs de code à reporter l’exécution.

Pour le tester, j’ai exécuté ce sur Chrome : http://jsfiddle.net/xXZMN/.

Cependant, il avertit . Pourquoi il n’est pas alerte ?

169voto

Alohci Points 30645

Quelques extraits de la spec HTML5: http://dev.w3.org/html5/spec/scripting-1.html#attr-script-defer

Le reporter et async attributs doivent ne pas être spécifiée si l'attribut src n'est pas présent.


Il y a trois modes possibles que peut être sélectionné à l'aide de ces attributs [async et de reporter]. Si l'attribut async est présent, le script sera exécutée de manière asynchrone, dès qu'il est disponible. Si l'attribut async n'est pas présent, mais l'attribut defer est présent, alors le script est exécutée quand la page a fini de de l'analyse. Si aucun attribut est présent, le script est extraite et exécuté immédiatement, avant que l' l'agent utilisateur continue l'analyse de la page.


Exactement le traitement des détails de ces les attributs sont, pour la plupart du temps historique raisons, quelque peu non-trivial, impliquant un certain nombre d'aspects de HTML. Les exigences de mise en œuvre sont donc, par nécessité, dispersés tout au long de la spécification. L' les algorithmes ci-dessous (dans cette section) décrire la base de ce traitement, mais ces algorithmes de référence et sont référencé par les règles d'analyse pour script de début et de fin des balises dans le code HTML, dans contenu étranger, et dans le fichier XML, les règles pour le document.méthode write (), le la manipulation des scripts, etc.


Si l'élément possède un attribut src, et cet élément a un attribut defer, et l'élément qui a été marqué comme "parser-insérés", et l'élément ne pas avoir un attribut async:

L'élément doit être ajouté à la fin de la liste des scripts exécuter lorsque le document a fini l'analyse associé au Document de l'analyseur qui a créé le de l'élément.

160voto

Chris Moschini Points 7278

La vraie réponse est: Parce que vous ne pouvez faire confiance à reporter.

Dans le concept, reporter et asynchrone se distinguent comme suit:

asynchrone 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, sauf qu'il garantit que les scripts s'exécutent dans l'ordre qu'ils ont été spécifiés sur la page. 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 qui est apparu 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 - qui est, paraît-il garantir à tous les scripts s'exécutent dans l'ordre d'apparition, mais parce qu'il interdit son utilisation dans les scripts inline, cette garantie est perdue.

Que de réponses ici de démontrer, mettre en œuvre les navigateurs reporter différente, de sorte que vous avez à traiter comme si elle a les mêmes garanties que asynchrone: Il peut télécharger en arrière-plan si le navigateur prend en charge, et il l'exécute... éventuellement. Pas de promesses sur la séquence.

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 ceci:

<script defer async src="..."></script>

98% des navigateurs utilisés dans le monde entier et 99% aux états-unis (Opéra être damnés) permet d'éviter le blocage avec cette approche.

53voto

Mark At Ramp51 Points 2101

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."

14voto

Rajesh Paul Points 1706

ne peut être utilisé en balise d’inclusion de script externe . C’est pourquoi il est conseillé de servir dans le -tags dans le -section.

7voto

Soumitra Points 85

L’attribut defer est réservée aux scripts externes (doit uniquement être utilisé si l’attribut src est présent).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X