29 votes

Solutions de contournement de bogue iframe de polices Web IE8

Ce blog (un peu ennuyeux, page là) (et ce n'est pas mon blog en passant) décrit un étrange bug que j'ai rencontré hier dans Internet Explorer 8 seulement. Le bug consiste .EOT polices web et <iframe> - éléments.

Je n'ai pas fait des recherches approfondies sur le déclencheur exacte pour le bug, mais c'est essentiellement le cas où une page à l'aide d'une police web qui charge le contenu dans un <iframe> tels que le cadre aussi utilise une police web devient "illisible" par le navigateur. Alors OK le texte rendu avec le web de police se déplace brusquement de terribles-à la recherche Arial ou quelque chose d'autre, tri de la sur son propre. Parfois, il retourne en arrière, seulement à se dégrader à nouveau au hasard sur les interactions de l'utilisateur comme la souris se déplace.

Ce billet de blog est un exemple. Pour clarifier, c'est le contenant de la page qui se foiré, pas de la page dans l' <iframe> (au moins, c'est le cas jusqu'à présent dans mon expérience).

Personne n'a trouvé une meilleure solution que ce qui est suggéré dans ce blog, qui est à la force d'un "reload" de la CSS, <link> élément d'où l' @font-face déclarations venir? (Je pourrais le faire mais ce serait une douleur mineure, et en plus il allait me forcer à bouger ma police d'installation de mon document <head> qui si je me souviens est un problème de performances; je vais devoir scrounge autour et trouver que friandise à nouveau.)

editionmise à jour

OK , voici une page de test. Voici les principales (conteneur) page:

<!DOCTYPE html>
<html>
  <head>
    <style id='font_style'>
      @font-face {
        font-family: 'bold-display';
        src: url('DejaVuSans-Bold.eot');
      }
    </style>
    <style>
      .fancy { font-family: bold-display, "franklin gothic medium", "verdana", sans-serif; font-size: 32px; }
      iframe { width: 500px; height: 200px; }
      #floater {
        position: absolute;
        top: 100px; left: 100px;
        display: none;
      }
      #floater.showing {
        display: block;
      }
    </style>
    <script>
      function load() {
        var frame = document.createElement('iframe'),
          floater = document.getElementById('floater'),
          target = document.getElementById('target');

        frame.src = 'frame.html';
        target.appendChild(frame);
        floater.className += 'showing';
      }
      function unload() {
        var floater = document.getElementById('floater'),
          target = document.getElementById('target');
        target.innerHTML = '';
        floater.className = floater.className.replace(/\bshowing\b/g, '');
      }
    </script>
  </head>
  <body>
    <div class='fancy'>Hello World</div>
    <button type='button' onclick='load()'>Click Me</button>
    <div id='floater'>
      <div id='target'></div>
      <button type='button' onclick='unload()'>Close</button>
  </body>
</html>

La page de cadre a même @font-face et un message fictif.

Le problème semble avoir quelque chose à faire avec l'aide du chargé de polices avec une liste de plus d'un suppléant de la police. J' (sans raison valable) avait jeté dans un couple de similaire plus-polices courantes dans mon "font-family" valeurs". Quand j'ai laissé tomber en arrière pour:

 .title { font-family: bold-display, sans-serif; }

ensuite, le problème a disparu (ou au moins, il semble avoir disparu à ce jour).

Merci à ceux qui ont aidé. À @albert, ajouter une réponse résumant ce que vous avez essayé et je vais upvote vous :-)

25voto

Ktash Points 5357

Donc, il n'y a pas de gain de performance avec les éléments suivants (tant que votre feuille de style CSS est de taille raisonnable), vous arrivez à quitter l' <link> tag <head>, et il fonctionne sans problème, mais vous êtes toujours en 'recharger" votre <link> éléments (si vous ne le font pas en redéfinissant leur url).

Sur la suppression de l' <iframe> élément, il suffit de faire ce qui suit:

var sheets = document.styleSheets;
for(var s = 0, slen = sheets.length; s < slen; s++) {
    sheets[s].disabled = true;
    sheets[s].disabled = false;
}

Le rechargement est tout ce que je pense vraiment de travailler depuis, il semble être en retrait dans la collecte des ordures de l' <iframe>. Configurer une page de test qui de toute évidence ne fonctionne que pour IE 8.

À Noter: j'ai été à l'origine incapable de reprodcue cette question en utilisant les polices web de Google, et avait précisément pour télécharger un .eot police pour l'utilisation de ce. Ainsi, votre travail autour de peut-être utiliser WOFF polices d'abord, et seulement de la charge EOT si nécessaire.

Pas exactement si c'est ce que vous cherchez, mais si c'est non, veuillez préciser et je vais le modifier en tant que de besoin.

Mise à jour 1: La cause

Donc, j'ai rétréci vers le bas la cause du problème. Je suis seulement capable de se reproduire si les conditions suivantes se produit (et c'est un méchant, un des gens).

  • Et <iframe> est contenu dans un élément parent
  • L'élément parent de la classe est modifiée
  • La classe de ne pas modifier l' display de l'élément appliqué à (ou vraiment, si ce n'est pas de modifier l'affichage sur l' <iframe> élément)

Et, à partir de ce que je peux dire, oui, ce doit être le nom de la classe. J'ai été incapable de reproduire donné les mêmes étapes sur l' id d'un élément. Sérieusement. C'est une sale. Je vais continuer à creuser un peu.

Mise À Jour 2: Une Cause Secondaire

Si l' <iframe> n'est pas entièrement dans la fenêtre du navigateur sur l'aspiration, il ne sera pas le chargement de la police au sein de la <iframe> de la fenêtre, et de décharger la police de la fenêtre principale à chaque fois qu'elle le rafraîchissement de la page (d'autant plus lorsqu'elle est redimensionnée). C'est une gnarly bug.

Mise à jour 3: Ce devrait être une solution

Au lieu d'utiliser display: none;, définissez la hauteur et la largeur de l'élément, 0px et de la overflow: hidden;, et vous obtiendrez le même effet que d'afficher aucun, mais il ne sera pas le supprimer de la DOM, afin de ne pas redessiner la page et de prendre votre police. Ma page de test à partir d'avant a été mis à jour, de sorte que vous pouvez voir l'effet sur le bug.

2voto

albert Points 5329

Si vous venez de générer de la croix-navigateur @font-face via la syntaxe fontsquirrel.com je ne pense pas que tu serais même d'avoir un problème. vous voulez être incorporation:

@font-face{
    font-family: 'DejaVuSansBook';
    src: url('DejaVuSans-webfont.eot'); /* ie9 compat mode */
    src: url('DejaVuSans-webfont.eot?#iefix') format('eot'),  /* ie 6-7-8 */
         url('DejaVuSans-webfont.woff') format('woff'), /* modern browsers */
         url('DejaVuSans-webfont.ttf') format('truetype'), /* Safari, Android, iOS */
         url('DejaVuSans-webfont.svg#webfontLXhJZR1n') format('svg'); /* Legacy iOS */
}

vous pouvez également utiliser la webfont chargeur de script si vous trouvez la syntaxe défaillante. Je n'ai pas de comparer la fonctionnalité du code répondu ci-dessus (je suis sûr que ça fonctionne), c'est le js typekit et googlefonts utiliser à la charge de leurs polices.

2voto

ConfidIT Points 21

Je suis tombé sur cette q&r pendant ses recherches, la situation est très semblable, à l'exception de la n de l'iframe que ce soit, d'être impliqué. Il a fallu l'aide d'un polices web de google et beaucoup de divs flottants à cause IE8 pour rendre le texte différemment après rechargement. Après avoir lu ce

Le problème semble avoir quelque chose à faire avec l'aide du chargé de polices avec une liste de plus d'un suppléant de la police.

J'ai changé la police de la pile dans mon css pour une seule alternative, et le bug a disparu.

Merci beaucoup de me pointer dans la bonne direction!

2voto

user2333923 Points 21

La solution que j'ai finalement utilisée était

 @font-face {
    font-family: 'NewsGothicFSMedium';
    src: url('NewsGothic-Medium-webfont.eot');
    src: url('NewsGothic-Medium-webfont.eot?#iefix')  format('embedded-opentype'),
         url('NewsGothic-Medium-webfont.woff') format('woff'),
         url('NewsGothic-Medium-webfont.ttf') format('truetype'),
         url('NewsGothic-Medium-webfont.svg#webfont') format('svg');
    font-weight: normal;
    font-style: normal;
}

@font-face {
    font-family: 'NewsGothicFSMediumIframe';
    src: url('NewsGothic-Medium-webfont.eot');
    src: url('NewsGothic-Medium-webfont.eot?#iefix')  format('embedded-opentype'),
         url('NewsGothic-Medium-webfont.woff') format('woff'),
         url('NewsGothic-Medium-webfont.ttf') format('truetype'),
         url('NewsGothic-Medium-webfont.svg#webfont') format('svg');
    font-weight: normal;
    font-style: normal;
}
 

Il vous suffit ensuite de référencer la famille de polices Iframe dans le CSS iframe. C'est un peu plus de CSS mais je pense que c'est mieux que de devoir recharger CSS si vous n'utilisez que quelques polices.

1voto

Julian Points 411

Aucune des autres solutions suggérées n'a fonctionné pour nous, nous avons donc dû simplement garder la page entière cachée jusqu'à ce que la page soit chargée. Nous l'avons fait avec le code suivant:

 <!--[if lte IE 8]>
    <style type="text/css">
        html {
            visibility: hidden;
        }
    </style>
    <script type="text/javascript">
        $(window).load(function() {
            $('html').css('visibility', 'visible');
        });
    </script>
<![endif]-->
 

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