2011-09-29 4 views
4

우리는 IE6에서 작동하지만 IE8에서는 작동하지 않는 타사 웹 응용 프로그램을 가지고 있습니다.document.write가 <head>에서 실행되는 경우 IE8에서 DHTML 동작이 작동하지 않는 이유는 무엇입니까?

샘플 코드는 아래와 같습니다. IE6에서 "message from .htc"메시지가 팝업되지만 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> 

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

이런 일이 왜 test.htc? 이것을 설명하는 모든 호환 가능한 문서?


솔루션

@Quentin 말했다 또는 http://social.msdn.microsoft.com/Forums/en-US/iewebdevelopment/thread/c1f546f6-d7e1-4b46-a1c9-8f02eaf1286b에서 다른 전문가는 IE8은 아마 엄격하게 IE6에 비해 규칙을 만들고, IE8은 손상 HTML 문서로 취급 할 수있다, 말했듯이.

그래서 document.write 대신 동적으로 요소를 생성하고이 요소를 DOM after some seconds delay에 삽입하기 위해 document.createElement을 사용하기로 결정했습니다. 몇 가지 테스트를 마친 후 마침내이 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> 

답변

4

는 네임 스페이스에도 불구하고, 당신은 text/html과 같은 문서를 제공하고 있습니다. HTML에서 head 및 body 요소의 시작 및 끝 태그는 선택 사항입니다. H1 요소는 머리 안쪽에 허용되지 않습니다.

따라서 document.write 및 H1이 끝에있을 때 머리 끝과 본문 시작이 트리거됩니다.

IE는 본문 요소의 시작 태그를 무시하고 두 번째 본문을 만들 것이라고 가정합니다 (이 또한 허용되지 않습니다).

+0

감사합니다. msdn 포럼에서 같은 대답을 얻었습니다. http://social.msdn.microsoft.com/Forums/en-US/iewebdevelopment/thread/c1f546f6-d7e1-4b46-a1c9-8f02eaf1286b, 전 생각합니다. 지연 함수를 사용하여 * 내용을'body '에 동적으로 씁니다. –