日期:2014-05-17  浏览次数:20598 次

IE6/7/8中使用innerHTML清空元素,其子元素也被清空

Bug 重现:

<!DOCTYPE HTML>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=gbk" />
        <title>IE6/7/8中innerHTML "Bug"</title>
    </head>
    <body>
		<div id="d">
			<div id="d2">d2 text</div>
		</div>
		<script>
			var d2 = document.getElementById('d2');
			var d = document.getElementById('d');
			d.innerHTML = '';
			alert(d2.innerHTML);
		</script>
    </body>
</html>

?

测试结果:
IE9 beta/Firefox3.6.10/Safari4/Chrome8 dev/Opera10 : 弹出 "d2 text" 文本
IE6/7/8 :弹出""空字符串

IE6/7/8中使用innerHTML清空父元素div[id=d],子元素div[id=d2]的innerHTML也被清了,子元素被清包括两个部分:
1,dom结构中清掉了
2,内存中innerHTML置为空字符串(d2.innerHTML)

而? 2 不应该被置为空字符串的,这是"Bug"。这里的"Bug"加引号,因为innerHTML并非标准的。各个浏览器都支持了,但实现上没有标准。
html5草案已经接纳innerHTML了:http://www.w3.org/TR/html5/embedded-content-0.html#dom-innerhtml

这个问题是 nick 发现的。

?

?

1 楼 dcdc723 2010-10-18  
<div id="d2">d2 text</div>
属于document.getElementById('d')对象的内容。。所以document.getElementById('d').innerHTML = ''之后。document.getElementById('d')节点就置空了,并不是BUG
2 楼 zhouyrt 2010-10-18  
dcdc723 写道
<div id="d2">d2 text</div>
属于document.getElementById('d')对象的内容。。所以document.getElementById('d').innerHTML = ''之后。document.getElementById('d')节点就置空了,并不是BUG


为什么IE9 beta/Firefox3.6.10/Safari4/Chrome8 dev/Opera10中document.getElementById('d2').inerHTML不为空呢?