如果执行document.write,为什么DHTML行为在IE8中不起作用?

时间:2011-09-29 07:31:38

标签: html internet-explorer-8 cross-browser html-components

我们有一个第三方网络应用程序可以在IE6中运行,但不适用于IE8。

示例代码如下所示,“.htc中的消息”消息将在IE6中弹出,但不会在IE8中弹出。

的test.html

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv='Content-Type' content='text/html; charset=UTF-8'/>
<script type='text/javascript'>
    //if comment the following line, or move this script in <body>,
    //then HTC will work in IE8
    document.write ("<h1>document.write() in &lt;head&gt;</h1> some calendar codes");
</script>
</head>

<body style='behavior:url(test.htc)'>
HTML Components test
</body>
</html>

test.htc

<script type='text/javascript'>
alert ("message from .htc");
</script>

为什么会这样?任何兼容的文件来解释这个?


解决方案

正如@Quentin所说或来自http://social.msdn.microsoft.com/Forums/en-US/iewebdevelopment/thread/c1f546f6-d7e1-4b46-a1c9-8f02eaf1286b的另一位专家所说,IE8可能会严格地将规则与IE6进行比较,IE8可能会将其视为损坏的HTML文档。

因此,我决定使用document.createElement动态创建元素而不是document.write,并将这些元素插入DOM after some seconds delay。经过一些测试,它最终在这个test.html和实际应用程序中都有效。

测试-IE8-compatible.html

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv='Content-Type' content='text/html; charset=UTF-8'/>
<script type='text/javascript'>
function Delay_CreateCalendar()
{
    var oContainer = document.createElement ("div");
    var oCalendarIFrame = document.createElement ("iframe");
    oContainer.appendChild (oCalendarIFrame);
    document.body.insertBefore (oContainer);
}
setTimeout (Delay_CreateCalendar, 2000);
</script>
</head>

<body style='behavior:url(test.htc)'>
dhtml HTC 测试
</body>
</html>

1 个答案:

答案 0 :(得分:4)

据推测,尽管有命名空间,但您将以text / html的形式提供文档。在HTML中,head和body元素的开始和结束标记是可选的。头部内不允许使用H1元素。

因此,当你在结尾处记录.write和H1时,你会触发头部的末端和身体的开始。

我认为IE会忽略body元素的开始标记,因为它会创建第二个主体(也是不允许的)。