Est de $(document).prêt() également CSS prêt?
J'ai un script s'exécutant sur $(document).prêt() qui est censé alignez verticalement élément de bloc dans ma mise en page. 90% du temps, il fonctionne sans problème. Cependant, pour que 10% de l'une des deux choses suivantes se produit:
-
Il y a un évident décalage dans le temps qu'il faut pour faire le centrage, et les éléments de bloc de saut en position. Ce pourrait être tout simplement lié à la performance - comme la taille de la page est souvent grande et il y a une bonne quantité de javascript qui est en cours d'exécution à la fois.
-
Le centrage sera complètement en désordre, et l'élément de bloc sera soit poussé trop loin ou pas assez loin. Il semble comme si elle a essayé de calculer la hauteur, mais a été d'obtenir une mauvaise mesure.
Est-il une raison pourquoi l'exécution d'un script sur les DOM-prêt n'auraient pas tous la bonne CSS valeurs injectées dans les DOM encore? (tous les CSS est dans le <head>
via un <link>
).
Aussi, voici le script qui est à l'origine du problème (oui, il a été pris directement à partir de ici):
(function ($) {
//VERTICALLY ALIGN FUNCTION
$.fn.vAlign = function() {
return this.each(function(i) {
var ah = $(this).height();
var ph = $(this).parent().height();
var mh = (ph - ah) / 2;
$(this).css('margin-top', mh);
});
};
})(jQuery);
Grâce.
- Existe-il des images impliqués? Même après que les styles sont calculées, le chargement des images peut causer de la nouvelle disposition.
Vous devez vous connecter pour publier un commentaire.
De la 1.3 notes de version:
De la prêt(fn) de la documentation:
Remarque que ci-dessus n'est même pas sur le fait d' rendu le CSS, vous pouvez toujours voir l'écran de changement quand
ready()
coups de pied dans. Mais il devrait vous sauver de problèmes.En fait, je trouve ça un peu étrange qu'il suffit de placer le CSS au-dessus de la JS permettra de résoudre tous les problèmes. Le CSS est chargé de manière asynchrone, donc JS chargement peut commencer et la finition alors que le CSS est encore en cours de téléchargement. Donc, si ce qui précède est une solution, alors l'exécution de tout code JS est alors interrompue jusqu'à ce que toutes les demandes antérieures ont terminé?
J'ai fait quelques tests, et en effet, parfois JS est retardée jusqu'à ce que le CSS est chargé. Je ne sais pas pourquoi, parce que la chute d'eau montre que la JS le chargement est terminé long avant de télécharger le CSS a fini.
Voir JS Bin pour code HTML et ses résultats (ce qui a un délai de 10 secondes), et de voir webpagetest.org pour sa cascade résultats. Il utilise un script de Steve Souders' cuzillion.com pour imiter la lenteur des réponses. Dans la chute d'eau, la référence à
resource.cgi
est le CSS. Donc, dans Internet Explorer, la première JS externe se charge juste après le CSS a été demandé (mais que CSS va prendre 10 secondes de plus à la fin). Mais la deuxième<script>
balise n'est pas exécutée jusqu'à ce que le CSS a fini de charger ainsi:Un autre test avec un deuxième JS externe après l'obtention de jQuery, montre que le téléchargement de la deuxième JS n'est pas commencé jusqu'à ce que le CSS est chargé. Ici, la première référence à
resource.cgi
est le CSS, le deuxième de la JS:Le déplacement de la feuille de style ci-dessous tous les JS montre en effet que le JS (y compris les
ready
fonction) s'exécute beaucoup plus tôt, mais même alors, le jQuery-classe appliquée --ce qui est encore inconnu lorsque la JS s'exécute-- est utilisé correctement dans mes tests rapides dans Safari et Firefox. Mais il est logique que des choses comme$(this).height()
donnera de mauvaises valeurs de l'époque.Cependant, des tests supplémentaires montre que il n'est pas un générique de la règle que le JS est arrêtée jusqu'à ce que la définition antérieure CSS est chargé. Il semble y avoir une certaine combinaison avec l'utilisation des CSS et JS. Je ne sais pas comment cela fonctionne.
Dernières notes: JS Bin inclut Google Analytics dans chaque script lors de l'exécution de la nue-URL (comme jsbin.com/aqeno, les résultats des tests sont effectivement modifié par JS Bin... Il semble que la Sortie sur l'onglet modifier les URL de la forme jsbin.com/aqeno/edit n'inclut pas les autres de Google Analytics choses, et certainement produit des résultats différents, mais que l'URL est difficile de test à l'aide de webpagetest.org. La référence à Les feuilles de style de Bloquer les Téléchargements de Firefox et d'Exécution de JavaScript dans IE donnée par strager est un bon début pour une meilleure compréhension, mais j'ai eu beaucoup de questions à gauche... à noter Également Steve Souders' IE8 Parallèle Script de Chargement pour rendre les choses encore plus compliquées. (Les chutes d'eau ci-dessus sont créés à l'aide de IE7.)
Peut-être que l'on devrait simplement croire les notes de publication et de documentation...
<head>
ou<body>
? Et compte tenu de la les feuilles de style de Bloquer les Téléchargements de Firefox et d'Exécution de JavaScript dans IE (donc, quels sont les autres navigateurs?) et IE8 Parallèle Script de Chargement je suppose que beaucoup de problèmes peuvent survenir pour le vertical et l'alignement de script. Et en passant: la chute d'eau pour le dernier IE8 webpagetest.org/result/090825_24AP ne PAS montrer le parallèle de chargement, et ressemble à IE7 webpagetest.org/result/090825_24AQ$(this).height();
le rendement peut être de zéro lorsque le CSS est chargé après le JavaScript, mais semble très bien lorsqu'il est chargé avant que. Mais encore, ne sachant pas le pourquoi, j'ai peur chaque navigateur peut se comporter différemment: jsbin.com/ofola/editCSS/JavaScript/JQuery commande ne fonctionne pas pour moi, mais ce qui suit ne:
Les DOM prêt déclenche lorsque tous les nœuds DOM sont disponibles. Il n'a rien à voir avec les CSS. Essayez de placer le style avant ou essayez de charger différemment.
Au meilleur de ma connaissance, les prêts événement est déclenché lorsque le DOM est chargé, ce qui signifie que tous le blocage des demandes (JS) ont chargé et l'arbre du DOM est entièrement tracé. Le prêt de l'etat dans IE s'appuie sur un rythme plus lent événement déclencheur de document.readyState changement vs DOMContentLoaded) que la plupart des autres navigateurs de sorte que le moment est navigateur charge également.
L'existence de non-blocage des demandes (comme CSS et images) est totalement asynchrone et non liée à l'état prêt. Si vous êtes dans une position où vous avez besoin de ces ressources dont vous avez besoin dépendent de la bonne vieille événement onload.
<script>
balises, pas pour la cuisson de laready
fonction elle-même). Mais si c'était la raison pour downvote, puis j'aurais aussi aimé voir quelques explications. M'aurait évité de faire quelques tests...Dans molily de tests (2010),
<script src>
)Tous les navigateurs modernes supportent maintenant DOMContentLoaded (2017), de sorte qu'ils peuvent avoir standardisé ce problème maintenant.