45 votes

Stupéfiant comme c'est bizarre IE 9 Javascript bug: la modification de doc titre fait exécuter le code suivant

Je ne comprends pas du tout. Voici un peu de code Javascript qui fonctionne dans tous les navigateurs, mais IE 9. Il est appelé à partir d'une animation Flash en utilisant ExternalInterface, et est destiné à redimensionner dynamiquement le film dans les DOM, si la taille de la séquence des changements à l'interne

function vResizeFlash(swfId, ht) {
    document.getElementById(swfId).height = "100%";
    document.getElementById('flashContainer').style.height = ht + "px";
}

Mais il fonctionne très bien si je modifier le document.titre:

function vResizeFlash(swfId, ht) {
    // IE 9 won't run the rest of this function unless
    // we go through the charade of changing the document title.
    if (navigator.appName.indexOf("Microsoft") != -1) {
       var docTitle = document.title.replace(/^(.+?)\s*$/,"$1");
       document.title = docTitle + " ";
    }
    // Well-coded browsers begin here
    document.getElementById(swfId).height = "100%";
    document.getElementById('flashContainer').style.height = ht + "px";
}

Ici j'ai simplement couper les blancs de l'espace sur le côté droit de l' document.title, puis ajouter d'un seul caractère d'espace blanc. Soudain, les lignes suivantes sont exécutées. Remarque: il existe d'autres ExternalInterface des appels sur la page, et tous fonctionnent très bien, même dans IE 9, il n'est donc pas un Flash/IE 9 problème.

Je suis tombé sur le correctif parce que je a été de modifier le titre pour afficher les arguments de la fonction (comme une mise au point rapide de test), juste pour s'assurer que la fonction était de faire la course. Et soudain, le code a fonctionné. Le sortir? Ne fonctionne pas. 100% reproductible.

Quelqu'un sait pourquoi cette absolument stupéfiante comportement prend place?

Mise à JOUR

@c69 a posé la question: "Peut-être que son IE9 est morte code remover?"

Je ne savais pas à ce sujet, j'ai donc Googlé et trouvé cet article sur le sujet, ainsi que certains de discussion d'ailleurs. Je ne connais pas assez pour évaluer la façon dont cela affecterait une à deux lignes de la fonction Javascript, cependant, surtout depuis l'une des lignes qui n'ont un référent sur la page (bien qu'il est en fin de chargement par le SwfObject code). Néanmoins, il serait un mauvais bug pour un code "optimiseur" pour supprimer des lignes de code qu'il jugeait inutile, car il ne comprend pas comment on les appelle. Et si elle n'a pas à comprendre comment les lignes sont appelés, comment l'insertion d'une ligne faisant un faux modification au document.titre rendre cette code soudainement "nécessaire"?

Mise à JOUR 2

Une autre pièce du puzzle que Cela peut avoir quelque chose à faire avec IE 9 est le mode de compatibilité. La page commence dans IE 9 les normes de la mode.

enter image description here

Maintenant, si je tourne sur IE mode de compatibilité,

enter image description here

le problème disparaît sans l'aide de la hack. L'éteindre, et le problème revient (si pas de hack présent).

Mais quand j'ai essayé de faire un test simple en utilisant exactement les mêmes HTML (moins d'un couple de balises JSP) et une dépouillé SWF qui contient uniquement le code de redimensionnement et les outils de test, tout fonctionne bien. Dans cette affaire, cependant, pas de compatibilité de l'icône est affichée.

enter image description here

Nous sommes à l'aide de Tomcat 6.0.32. Je ne suis pas au courant que nous sommes spécial aux en-têtes, et il n'y a pas de balises meta concernant IE mode de compatibilité (dans l'application principale ou dans mon appli de test).

2voto

Charlie Points 36

comme InvertedSpear mentionne, vérifiez votre type de doc, j'ai eu des problèmes avec IE9 récemment et la plupart des il est apparu pour la Doc balises de type de déclenchement d'un mode de compatibilité, je n'ai pas besoin, la même chose peut être vrai pour le meta tags de sorte qu'il pourrait se résument à vos balises Meta.

Vous pouvez toujours imposer un travail le mode de compatibilité en utilisant les liens ci-dessous.

de: http://evolpin.wordpress.com/2011/02/25/ie9-compatibility-and-the-meta-tag/

J'ai découvert que c'est bien documenté par Microsoft...

http://msdn.microsoft.com/en-us/library/cc288325(SV.85).aspx

"X-UA-Compatible-tête n'est pas sensible à la casse; toutefois, il doit apparaître dans l'en-tête de la page (la section d'en-TÊTE) avant tous les autres éléments, à l'exception de l'élément de titre et d'autres éléments meta."

2voto

Scott Points 21

Chaque fois que je vois quelque chose comme cela arrive dans n'importe quelle langue c'est parce qu'il y a un autre code qui a un bug. Comme vous l'avez souligné votre cas simple ne produit pas le problème. Essayez de supprimer les autres code de quelques lignes à un moment jusqu'à ce que le problème disparaît - le dernier supprimé le code doit contenir le problème.

Cheers

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