令人费解的IE 9 Javascript错误:改变文档标题会使后续代码执行

Rob*_*sto 45 javascript internet-explorer internet-explorer-9

我根本不明白这一点.这里有一些Javascript代码可以在每个浏览器中运行,但是IE 9.它是从Flash电影中调用的,ExternalInterface如果电影的大小在内部发生变化,则意味着动态调整DOM中的电影大小

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

但是如果我改变文档,它的工作正常.标题:

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";
}
Run Code Online (Sandbox Code Playgroud)

在这里,我只是从右侧修剪任何空白区域document.title,然后为其添加一个空白字符.突然,下面的行被执行了.注意:ExternalInterface页面上还有其他调用,即使在IE 9中,它们都可以正常工作,因此它不是Flash/IE 9的问题.

我偶然发现修复因为我正在改变标题以显示函数参数(作为快速调试测试),只是为了确保函数正在运行.突然代码工作了.拿出来?不行.100%可重复.

有谁知道为什么这种绝对令人发指的行为发生了?

UPDATE

@ c69提出了一个问题:"也许它的IE9的死代码卸载?"

我不知道这个,所以我去了谷歌搜索并发现了关于这个主题的文章,以及其他地方的一些讨论.我不知道如何评估它会如何影响两行Javascript函数,但是,特别是因为其中一行在页面上有一个引用(尽管它是通过SwfObject代码进行后期加载).但是,代码"优化器"删除它认为不必要的代码行是一个非常糟糕的错误,因为它不了解它们的调用方式.如果它确实无法理解如何调用这些行,那么如何将伪造的行更改为document.title如何使该代码突然"必要"?

更新2

另一个难题这可能与IE 9的兼容模式有关.该页面以IE 9的标准模式开始.

在此输入图像描述

现在,如果我打开IE的兼容模式,

在此输入图像描述

如果不使用上述黑客,问题就会消失.关闭它,然后问题返回(如果没有黑客存在).

但是当我尝试使用完全相同的HTML(减去几个JSP标记)和一个仅包含调整大小代码和测试工具的精简版SWF进行简单测试时,一切正常.但是,在这种情况下,根本不显示兼容性图标.

在此输入图像描述

我们正在使用Tomcat 6.0.32.我不知道我们正在使用任何特殊标头,并且没有关于IE兼容模式的元标记(在主应用程序或我的测试应用程序中).

小智 2

就像 InvertedSpear 提到的,检查你的文档类型,我最近在使用 IE9 时遇到了问题,其中大部分归结为文档类型标签触发了我不需要的兼容模式,元标签也是如此所以它可能归结为你的元标签。

\n\n

您也可以随时使用下面的链接强加工作兼容模式。

\n\n

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

\n\n

我\xe2\x80\x99ve发现这确实是由Microsoft\xe2\x80\xa6记录的

\n\n

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

\n\n

\xe2\x80\x9cX-UA-Compatible 标头不区分大小写;但是,它必须出现在网页标题(HEAD 部分)中,位于除 title 元素和其他元元素之外的所有其他元素之前。\xe2\x80\x9d

\n