Stufffyingly奇怪的IE 9的JavaScript错误:改变文档标题使后续的代码执行

我根本不明白这一点。 这里是一些JavaScript代码,可以在每个浏览器中使用,但是使用IE 9。它是使用ExternalInterface从Flash电影中调用的,如果电影的大小在内部发生更改,则会dynamic调整DOM中的电影的大小

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

但它工作正常,如果我改变document.title:

 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"; } 

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

我偶然发现了这个问题,因为我改变了标题来显示函数参数(作为一个快速的debuggingtesting),只是为了确保函数正在运行。 代码突然出现了。 把它拿出来? 不起作用。 100%可重现。

有人知道为什么这个绝对愚蠢的行为发生?

UPDATE

@ c69提出了这个问题:“也许它的IE9的死码卸妆?

我不知道这件事,于是我去Googlesearch了一下这个话题,并在其他地方讨论了一下。 我不太了解它是如何评估这将影响双线Javascript函数的,但是,特别是因为其中一行确实在页面上有引用(尽pipe它是通过SwfObject代码进行的后期加载)。 不过,对于代码“优化器”来说,删除它认为没有必要的代码行是一个非常糟糕的错误,因为它不知道如何调用它们。 如果它不知道如何调用这些行,那么如何在文档中插入一条伪造的代码?标题突然渲染该代码突然“必要”?

更新2

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

在这里输入图像说明

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

在这里输入图像说明

没有使用上面的黑客,问题就消失了。 把它关掉,问题返回(如果没有黑客存在)。

但是,当我试图使用完全相同的HTML(减去几个JSP标签)和一个简单的testing,只包含resize的代码和工具来testing,一切工作正常。 但是,在这种情况下,根本不显示任何兼容性图标。

在这里输入图像说明

我们正在使用Tomcat 6.0.32。 我不知道,我们正在使用任何特殊的标题,并没有关于IE兼容模式元主标签(在主应用程序或在我的testing应用程序)。

像InvertedSpear提到,检查你的文档types了,我最近有问题,最近的IE9和大部分归结为Doctypes标签触发一个兼容性模式,我不需要,元标签也是如此,所以它可能归结为您的Meta标签。

您也可以使用以下链接强制使用兼容模式。

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

我发现这确实是由微软logging的…

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

“X-UA兼容头不区分大小写; 但是,除了标题元素和其他元素之外,它必须出现在网页头部(HEAD部分)的所有其他元素之前。

每当我看到这样的事情发生在任何语言,这是因为有其他代码有一个错误。 正如你指出你的简单情况不会产生问题。 尝试一次删除其他代码几行,直到问题消失 – 最后删除的代码应该包含这个问题。

干杯