获取DOM节点的方法有很多,如常用的getElementById()、getElementsByTagName(),前者返回一个节点元素,后者返回的是节点的集合。看似相同,实际上其中大有文章:
1、getElementById()
返回的节点可以保存到变量中,即便使用removeChild()方法移除,也能再通过保存的变量使用该节点。
测试下面的代码:

<div id="test">hello world</div>
<script type="text/javascript">
	(function(){
		var oDiv = document.getElementById('test');
		document.body.removeChild(oDiv);
		alert(oDiv.innerHTML);//hello world
	})()
</script>



2、getElementsByTagName()
返回的值仅仅是对DOM节点地址的引用,如果使用removeChild()删除节点,返回值是会变化的。可能用图示更清晰吧

测试下面的代码加深印象:

<ul id="test">	<li>hello world</li>	<li>hello world2</li></ul><script type="text/javascript">
	(function(){
		var oDiv = document.getElementById('test'),oLi = document.getElementsByTagName('LI');
		oDiv.removeChild(oLi[0]);
		alert(oLi[0].innerHTML);//期望的是hello world,实际上输出的是hello world2
	})()
</script>



这种引用问题时有发生,解决的方法可用数组结合去存储返回值,类似于getElementById:

<ul id="test">	<li>hello world</li>	<li>hello world2</li></ul><script type="text/javascript">
	(function(){
		var oDiv = document.getElementById('test'),oLi = document.getElementsByTagName('LI'),arr = [];
		arr[0] = oLi[0];
		arr[1] = oLi[1];//数量多了可用循环遍历
		oDiv.removeChild(oLi[0]);
		alert(arr[0].innerHTML);//hello world
	})()
</script>



不过问题又来了,如果我们用innerHTML=”"代替removeChild,你会发现在IE浏览器下最后的输出会是空的

<ul id="test">	<li>hello world</li>	<li>hello world2</li></ul><script type="text/javascript">
	(function(){
		var oDiv = document.getElementById('test'),oLi = document.getElementsByTagName('LI'),arr = [];
		arr[0] = oLi[0];
		arr[1] = oLi[1];//数量多了可用循环遍历
		oDiv.innerHTML='';
		alert(arr[0].innerHTML);//IE下为空
	})()
</script>



再次改进存储方法,使用强大的cloneNode()

<ul id="test">	<li>hello world</li>	<li>hello world2</li></ul><script type="text/javascript">
	(function(){
		var oDiv = document.getElementById('test'),oLi = document.getElementsByTagName('LI'),arr = [];
		arr[0] = oLi[0].cloneNode(true);
		arr[1] = oLi[1].cloneNode(true);
		oDiv.innerHTML='';
		alert(arr[0].innerHTML);//hello world
	})()
</script>



, , ,
Trackback

5 comments untill now

  1. 我觉得有一点对我来说很有用,即:document.getElementById(…)得到的是一个HTML元素对象的引用~~不论这个元素是否在文档流之中,或者被移出文档。

  2. 问声,贵博feed可以设置为全文输出么

    米克 于 2009-6-24 21:45:10 回复

    不是太明白你的意思,放上两个地址不知道对不对
    1.http://www.silentash.com/rss.xml
    2.http://www.silentash.com/feed.asp
    这两个都可以看到所有的

  3. 1111111111

  4. 看不到,我在gr里只能看到部分的,其余的被你截断了哈。

  5. 按我的思路,储存DOM元素节点首先也会尝试使用变量,接着才会想到cloneNode,现在知道了你对于getElementsByTagName的解释,长见识了!!!!cloneNode是对DOM元素复制了一个副本,这个是会更兼容。

Add your comment now

Please wrap all source codes with [code][/code] tags.