博客园 :: 首页 ::  ::  ::  :: 管理
element.appendChild(newNode) 方法中,如果 newNode本身是Dom中的一个节点. 那么appendChild方法执行的不再
是append操作了,而是一个move操作. 比如说:

<html>
<script>
function f(){
document.body.appendChild(document.getElementById(
"btn1"))
}

</script>
<body onload=f()>
<input type=button id=btn1 value="button 1">
<input type=button id=btn2 value="button 2">
<input type=button id=btn3 value="button 3">
<input type=button id=btn4 value="button 4">
</body>
</html>

因为btn1本身是dom 中的一个节点,所以 appendChild操作会将 btn1 移动到 btn4的后面,而不是复制.

利用这个特点,我们可以用极少量的代码实现另类的文字无缝滚动.

代码如下:

appendChild实现的无缝滚动

呵呵,是不是很简洁呢,  这个方法我在今年五月份的时候发到了CSDN上,当时引起了许许多多的JavaScript爱好
者的大讨论, 那帖子被CSDN首页置顶,三百人参与回复讨论.  

原贴地址:  最简单的无缝滚动程序,只需要五行代码

 

除了这个应用, appendChild的这个特性还可以在表格排序上大展身手.

注意,下面表格排序代码只是为了说明 appendChild的用法,没有在 ff中测试.

页面加载后,表格根据第一列数字由小到大进行排序<br>

<table border id="tbl" width="40%">
<tr><td>12</td><td>1</td></tr>
<tr><td>9</td><td>2</td></tr>
<tr><td>15</td><td>3</td></tr>
<tr><td>18</td><td>4</td></tr>
<tr><td>1</td><td>5</td></tr>
</table>

<script>

// by Go_Rush(阿舜)  from http://ashun.cnblogs.com/

function $A(arrayLike){
     
for(var i=0,ret=[];i<arrayLike.length;i++) ret.push(arrayLike[i]);
     
return ret
}

Array.prototype.each
=function(f){for(var i=0;i<this.length;i++) f(this[i],i,this)}

window.onload
=function(){
     $A(document.getElementById(
"tbl").rows).sort(function(tr1,tr2){
    
return Number(tr1.cells[0].innerHTML)>Number(tr2.cells[0].innerHTML)?1:-1
      }).each(
function(tr){
    document.getElementById(
"tbl").firstChild.appendChild(tr)
     })    
}
</script>

怎么样,有了appendChild 的大力相助,这个排序够简单吧.

关于表格的更多操作方法,和高级的自定义表格排序,请参见我在CSDN的另一个帖子(也是用appendChild实现的排序,且兼容firefox)

http://community.csdn.net/expert/Topicview2.asp?id=5174915



 

Feedback

#1楼  回复 引用 查看   

2006-11-30 07:41 by 兰亭      
嗯,有新意

#2楼  回复 引用 查看   

2006-11-30 08:27 by qqhe325      
学习!

#3楼  回复 引用 查看   

2006-11-30 08:31 by qqhe325      
请问 在ie中
d.onmouseover=function(){clearInterval(t)}
中的d未定义是怎么回事啊,字的滚动可以

#4楼  回复 引用 查看   

2006-11-30 08:42 by 风云      
学习!

#5楼  回复 引用 查看   

2006-11-30 08:43 by 布尔      
文风简洁,内容创新,我很喜欢

#6楼  回复 引用 查看   

2006-11-30 09:10 by 维生素C.NET      
顶一下. keep writing~

#7楼  回复 引用 查看   

2006-11-30 09:13 by dudu      
不错!谢谢分享!

#8楼  回复 引用 查看   

2006-11-30 09:37 by 数据绑定者      
很好,很有创意

但是如果我的是一个GridView 我在模版列里放了Table,在浏览器中的源代码是类似于这种:

<table cellspacing="0" border="0" id="d3" style="width:100%;border-collapse:collapse;">
<tr>
<td>
<table id="d5" cellspacing="0" cellpadding="0" width="100%" border="0">
<tr>
<td width="20">
<img height="14" src="../images/arrow_r.gif" width="10"></td>
<td>
<a href="/Pages/ShowPost.aspx?DiaryID=1070">
<span id="ctl00_Technology1_GridViewAllDiarys_ctl02_Label2" style="color:Blue;font-

size:12px;">testfgff''''--</span></a>


</td>
</tr>
<tr>
<td colspan="2">
<table id="Table2" cellspacing="0" cellpadding="0" width="100%" border="0">
<tr>
<td background="../images/dot.gif">
<img height="1" src="../images/dot.gif" width="3"></td>
</tr>
</table>
</td>
</tr>
</table>
</td>
</tr><tr>
<td>
<table id="Table1" cellspacing="0" cellpadding="0" width="100%" border="0">
<tr>
<td width="20">
<img height="14" src="../images/arrow_r.gif" width="10"></td>
<td>
<a href="/Pages/ShowPost.aspx?DiaryID=978">
<span id="ctl00_Technology1_GridViewAllDiarys_ctl03_Label2" style="color:Blue;font-

size:12px;">jfg</span></a>


</td>
</tr>
<tr>
<td colspan="2">
<table id="Table2" cellspacing="0" cellpadding="0" width="100%" border="0">
<tr>
<td background="../images/dot.gif">
<img height="1" src="../images/dot.gif" width="3"></td>
</tr>
</table>
</td>
</tr>
</table>
</td>
</tr>
</table>

前面有图片,下面也有图片的,我想让中间的数据滚动,我自己试了试,没有成功,难道不可以设定哪些内容需要滚动么?(内容是不连续的)

#9楼  回复 引用 查看   

2006-11-30 10:13 by Cat Chen      
很好的做法。不过你是否确认这就是w3c标准中已确定的append行为,如果不是的话我怕以后浏览器会改变其行为。

#10楼[楼主]  回复 引用 查看   

2006-11-30 10:23 by Go_Rush      
@Cat Chen
是的, ff和ie 都支持这个的,w3c标准

在W3C中
appendChild方法有写到
Adds the node newChild to the end of the list of children of this node. If the newChild is already in the tree, it is first removed.

http://www.w3.org/TR/2000/WD-DOM-Level-1-20000929/level-one-core.html#ID-184E7107


不管对于 html dom 还是 xml dom 都是适用的

#11楼[楼主]  回复 引用 查看   

2006-11-30 10:24 by Go_Rush      
@数据绑定者
中午再看你的代码,给你回复。。

#12楼[楼主]  回复 引用 查看   

2006-11-30 10:24 by Go_Rush      
@dudu
谢谢,请多关注这里,每天都有新原创

#13楼[楼主]  回复 引用 查看   

2006-11-30 10:25 by Go_Rush      
@维生素C.NET
我会继续努力的

#14楼[楼主]  回复 引用 查看   

2006-11-30 10:29 by Go_Rush      
@布尔
谢谢,你的表扬让我如浴春风

#15楼[楼主]  回复 引用 查看   

2006-11-30 10:31 by Go_Rush      
@qqhe325
d.onmouse....
改为
document.getElementById("d").onmouse....

#16楼[楼主]  回复 引用 查看   

2006-11-30 10:40 by Go_Rush      
@兰亭
谢谢,本博客刚建立不久,请多关注

#17楼  回复 引用   

2006-11-30 10:47 by luckbird[匿名][未注册用户]
不错,收藏!

#18楼  回复 引用 查看   

2006-11-30 11:24 by Wisdom-zh      
有点意思!

#19楼  回复 引用   

2006-11-30 11:40 by 脚本之家[未注册用户]
好东西啊,谢谢啊,又学到点东西

#20楼  回复 引用   

2006-11-30 12:11 by 哈哈[匿名][未注册用户]
用了each(...),是不是引入了Prototype.js?

#21楼[楼主]  回复 引用 查看   

2006-11-30 12:24 by Go_Rush      
@哈哈[匿名]
没有, 请注意代码中,有这么一行
Array.prototype.each=function(f){for(var i=0;i<this.length;i++) f(this[i],i,this)}
当然,如果你事先引入了 prototype.js 上面那行就不需要了

#22楼[楼主]  回复 引用 查看   

2006-11-30 13:09 by Go_Rush      
@数据绑定者
如果你想滚动表格的行的话,请使用 tbl.firstChild.appendChild
table是不能直接 table.appendChild的,因为中间还有一个 TBody

#23楼  回复 引用 查看   

2006-11-30 14:28 by 数据绑定者      
@Go_Rush

tbl.firstChild.appendChild

也不行,你实验成功了?

#24楼[楼主]  回复 引用 查看   

2006-11-30 14:40 by Go_Rush      
@数据绑定者
你的代码让我无法调试,而且我对你的题目的要求理解也不清晰。
我不太清楚你到底想滚动哪部分? 而且你代码里有两个 id="table2"
的表格,让我感觉很混乱。
这样吧,你把问题发到 csdn 的 JavaScript版,我会帮你解答的

#25楼  回复 引用 查看   

2006-11-30 16:25 by 臭石头      
太强了

的确是不常用的操作,呵呵。

#26楼  回复 引用 查看   

2006-11-30 18:37 by 鲁鲁      
不错,先留下来,以后慢慢看。

#27楼[楼主]  回复 引用 查看   

2006-11-30 19:21 by Go_Rush      
@臭石头 && 鲁鲁

以后常来啊,我这里更新很快的。原创多多。

#28楼  回复 引用   

2006-12-08 10:07 by woneinwy[未注册用户]
很强哦。我对DOM的理解总是不够。
以后多向你学习

#29楼  回复 引用   

2006-12-12 19:33 by hehe[匿名][未注册用户]
你的dom代码在mozilla firefox5里运行不了,在netscap6里也运行不了,不知道怎么解决这个问题?

#30楼[楼主]  回复 引用 查看   

2006-12-13 20:44 by Go_Rush      
@hehe[匿名]
appendChild 方法是 W3C推荐的方法, ie 和 ff都支持的,这两个浏览器对于
这个方法的实现是没有差异的.我po文的时候,代码全在 ie6.0和 ff.15测试通过
没有问题的,netscap6倒没有测过.. 你的出错提示是什么?

#31楼  回复 引用   

2006-12-17 12:59 by sunaer[未注册用户]
不错.
已经加入收藏

#32楼  回复 引用 查看   

2007-01-16 07:45 by 小生      
收藏

#33楼  回复 引用   

2007-02-10 10:57 by finder[未注册用户]
请教,这个appendChild() 是不是对新开的窗口文档无效? 我在论坛问了没人回

如下边的代码,对新窗口使用appendChild()总提示不支持,可是对本窗口应用就没有问题。


当前窗口:
<body><div id="ydiv"> PageData </div></body>
<SCRIPT type=text/javascript>

var newWin = window.open("newPage.html"); // OK

var zhtml = document.createElement("zdiv");
zhtml.innerHTML = "ZZZ" ;

var varXdiv =newWin.document.getElementById('xdiv'); // OK

newWin.document.write(zhtml.innerHTML); // OK
newWin.document.body.appendChild(zhtml); // interface not supported
varXdiv.appendChild(zhtml); // interface not supported

document.body.appendChild(zhtml); // OK
</SCRIPT>

第二个文件 newPage.html:

<body> <div id="xdiv"> newPage data </div>
</body>


因为新窗口要写的内容比较多,用write() 太麻烦了,有没有好方法?

#34楼  回复 引用 查看   

2007-02-10 20:03 by 布尔      
zhtml应该用newWin.document来创建,改代码:
zhtml = newWin.document.createElement('div')

#35楼  回复 引用   

2007-07-19 21:30 by rym1020[未注册用户]
我一行代码就可以实现

<MARQUEE behavior="scroll" contenteditable="true" onstart="this.innerHTML+=this.innerHTML;" scrollamount="3" width="100"><SPAN unselectable="on">这里是要滚动的内容</SPAN></MARQUEE>

#36楼  回复 引用   

2007-07-19 21:31 by rym1020[未注册用户]
三行代码完美模拟marquee跑马灯首尾相连循环滚动效果(兼容firefox)

function scroll(objid) {
var obj = document.getElementById(objid);
var tmp = (obj.scrollLeft)++;
if (obj.scrollLeft==tmp) obj.innerHTML += obj.innerHTML;
}

示例:<DIV id="announce" style="white-space:nowrap;overflow:hidden;width:100px;">这里是要滚动的内容</DIV>
调用:<script>setInterval("scroll('announce')",20);</script>

就这么简单的3行代码,就可以实现滚动内容首尾相连,不间断的循环滚动,而且完全符合W3C标准,也就是说在IE和firefox等其他浏览器上都可以使用。

#37楼  回复 引用 查看   

2010-06-24 11:49 by 康董      
阿瞬这个发现的确不错..
我发现这里的appendchild介绍也不错哦 而且还有大量的dom指令
appendchild
getElementById
offsetParent
document

阿舜很想和你的博客做个链接.或者你其他的网站.望考虑!联系我QQ:30458885