Почему поведение DHTML не работает в IE8, если document.write выполняется в <head>? - PullRequest
4 голосов
/ 29 сентября 2011

У нас есть стороннее веб-приложение, которое работает в IE6, но не работает в IE8.

Пример кода, как показано ниже, сообщение «message from .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 через несколько секунд .После некоторых тестов он наконец заработал как в этом test.html, так и в реальном приложении.

test-ie8-compatibility.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 Ответ

4 голосов
/ 29 сентября 2011

Предположительно, несмотря на пространство имен, вы передаете документ в виде text / html. В HTML теги start и end для элемента head и body являются необязательными. Элементы H1 не допускаются внутрь головы.

Таким образом, когда вы используете document.write и H1 внутри конца, вы запускаете конец заголовка и начало тела.

Я предполагаю, что IE затем игнорирует начальный тег для элемента body, так как это создаст второе тело (что также не разрешено).

...