javascript - try - typescript抛出异常




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

像InvertedSpear提到的那样,检查你的doc类型,我最近遇到了IE9的问题,大部分归结为Doc类型标签触发了我不需要的兼容模式,meta标签也是如此,所以它可能归结为您的Meta标签。

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

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

我发现这确实是微软记录的......

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

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

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

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

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

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的问题。

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

任何人都知道为什么这种绝对令人发指的行为发生了?

UPDATE

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

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

更新2

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

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

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

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

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


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

干杯





internet-explorer-9