37 votes

Comment savoir si la police de caractères a été appliquée ?

Je suis en train de créer un site Web d'entreprise pour un client qui utilise beaucoup de polices personnalisées.

Sur jQuerys DOM-ready, j'effectue des calculs de placement pour déterminer l'endroit où certains menus contextuels avec une largeur et une hauteur dynamiques doivent être placés en fonction de leur contenu dynamique.

Ces calculs échouent, car DOM-ready est déclenché avant l'application de font-face, et les largeurs et hauteurs sont donc incorrectes.

Pour l'instant (pour le prototype), je fais les calculs 500ms après le DOM-ready pour pallier ce problème, mais cela ne peut pas être mis en production pour des raisons évidentes.

Le problème a été observé dans les dernières versions de Firefox et de chrome. IE 8 ne semble pas avoir ce problème, mais DOM-ready se déclenche assez tard, donc le délai est en quelque sorte intégré, je suppose :)

Attendre l'événement de chargement n'est pas une option, donc ma question est la suivante :

Existe-t-il un moyen fiable et inter-navigateurs de détecter l'application d'une police de caractères ?

0 votes

Je ne sais pas si cela peut aider, mais au lieu de faire votre magie sur document.ready, essayez de la faire sur window.load. Cela se déclenche un peu plus tard lorsque les images, etc. sont chargées, mais il peut y avoir un certain scintillement des polices, ce qui semble indésirable.

0 votes

Comme je l'ai déjà dit, attendre l'événement de chargement n'est pas une option.

0 votes

OK, alors qu'utilisez-vous pour appliquer la police de caractères ? Il existe des librairies pour faire ce genre de choses, qui ont peut-être déjà déclenché l'événement approprié au bon endroit. Cufon, FLIR et SIFR sont quelques-unes des bibliothèques dont je me souviens qui sont exactement destinées à gérer le remplacement des polices et je serais étonné qu'elles n'aient pas réussi à résoudre le problème ci-dessus !

58voto

Martin Jespersen Points 13702

J'ai trouvé une solution après m'être demandé pourquoi IE ne souffre pas de ce problème.

Firefox et Chrome/Safari déclenchent le DOMContentLoaded avant l'application de la police, ce qui cause le problème.

La solution est de ne pas écouter DOMContentLoaded mais à la place, allez-y à l'ancienne et écoutez onreadystatechange et attendez que le document.readyState === 'complete' qui est toujours déclenché après l'application du font-face (d'après mes tests) - ce qui est bien sûr ce qui se passe toujours dans IE puisqu'il ne supporte pas l'option DOMContentLoaded .

En fait, vous pouvez créer votre propre événement en jQuery appelé fontfaceapplied - peut-être qu'il devrait être intégré ;)

document.onreadystatechange = function() {
    if (document.readyState === 'complete') 
        $(document).trigger('fontfaceapplied');
};

Fait amusant : Opera le fait droite et attend de déclencher DOMContentLoaded jusqu'à ce que la police soit appliquée.

1 votes

+1. Hmm. Très intéressant, et un excellent travail de recherche. Merci de l'avoir partagé. Je vais devoir me souvenir de celle-ci. (btw, je sens un badge 'Self Learner' dans votre futur proche.... ;-))

6 votes

Excellente réponse, mais j'ai constaté que Chrome (16.0.912.77) indique que l'état de préparation est "complet" même si la police de caractères n'a pas été appliquée. Plus précisément, si elle a été appliquée, elle ne sera pas nécessairement disponible si vous essayez de l'utiliser dans un contexte tel que Canvas. De plus, un piège dans lequel je viens de tomber, jQuery n'attendra pas de déclencher son événement ready jusqu'à ce qu'il soit "complet", il se déclenchera également si l'état est "interactif".

0 votes

@tapi : l'événement ready de jQuerys écoute DOMContentLoaded, il est donc inutile lorsqu'il est utilisé avec des polices personnalisées.

10voto

AmerllicA Points 1

Mise à jour de l'ES6 :

Le poste de question est pour de nombreuses années que le IE Les versions 8 et antérieures d'Ecmascript étaient encore en vie et même la version 6 d'Ecmascript n'était pas encore sortie, mais maintenant vous pouvez écrire des callbacks sur document.fonts événements, par exemple

document.fonts.onloadingdone = () => {
  // do something after all fonts are loaded
};

Pour plus d'informations, voir ce poste .

0voto

chim Points 1799

Le fait de configurer la fonction pour qu'elle se déclenche après un délai de 200 ms résout ce problème lors de l'utilisation de Google Fonts.

Il y a un saut notable, mais c'est généralement le cas pour les choses de même hauteur. Pour les puristes, ce n'est peut-être pas parfait, mais cela fonctionne sur tous les navigateurs.

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