可拖动DOM模型2
默认分类 2011-04-05 20:26:47
转载:http://kenshin54.iteye.com/blog/365661
- <html>
- <head>
- <title>TreeView</title>
- <style>
- body{
- margin:0px;
- }
- #dragDiv{position:absolute;display:none;background-color:#3366cc;color:#ffffff;}
- .title{border:0px;font-size:16px;}
- .node{padding-left:20px;overflow:hidden;}
- .icon{display:inline;margin-right:5px;cursor:pointer;}
- </style>
- <script type="text/javascript" language="javascript">
- /
- Simple tree with "drag and drop".
- Author:rains31@gmail.com
- /
- var Tree;
- function pageonload()
- {
- Tree = new TreeView('TreeRoot');
- Tree.addNode('TreeRoot','test0','test0','test0');
- for(i=1;i<100;i++)
- {
- Tree.addNode('test'+Math.floor(Math.random()*i),'test'+i,'test'+i,'test'+i);
- }
- document.onmousedown = Tree.DragStart;
- document.onmouseup = Tree.DragStop;
- document.onmousemove = Tree.Draging;
- }
- //check if node1 is a offspring of node2
- //判断node1是否是node2的后代
- isOffspring=function(node1,node2)
- {
- while(node1!=null && node1!=node2)
- {
- node1node1 = node1.parentNode;
- }
-
- return node1==node2;
- }
- window.onload = pageonload;
-
- TreeView = function(Root)
- {
- this.root = document.getElementById(Root);
- this.lastObj = null;
- this.oSelected = null;
- if(this.root == null)
- {
- alert('Invalid tree root!');
- return false;
- }
-
- //每个nodeId必须是唯一的合法的html元素Id,且不能以title,icon,child之类的结尾
- this.addNode = function(parentId,nodeId,nodeName,link)
- {
- var oParent = document.getElementById(parentId);
- //父节点合法不?
- if(oParent == null) return;
- var oNode = document.createElement('div');
- oNode.id = nodeId;
- oNode.className = 'node';
- //真够费劲的
- oNode.innerHTML = "<div id='"+nodeId+"_title' class='title'><span class='icon' onclick='Tree.fold(this)'>-</span>"+nodeName+"</div>";
- oParent.appendChild(oNode);
- }
- this.DragStart = function(e)
- {
- ee = e || window.event;
- this.DragObj = e.target || e.srcElement;
- //是否是合法的节点?
- if(this.DragObj.className != 'title')return;
- if(this.oSelected !=null)
- {
- this.oSelected.style.backgroundColor = '';
- }
- this.tmpNode = document.getElementById('dragDiv');
- thisthis.tmpNode.innerHTML = this.DragObj.lastChild.nodeValue;
- thisthis.DragObj = this.DragObj.parentNode;
- //debug('drag start:'+this.DragObj.id+':'+this.DragObj.className);
- this.indrag = true;
- this.x = e.pageX || (e.clientX + (document.documentElement.scrollLeft || document.body.scrollLeft));
- this.y = e.pageY || (e.clientY + (document.documentElement.scrollTop || document.body.scrollTop));
- this.left = parseInt(this.tmpNode.offsetLeft);
- this.top = parseInt(this.tmpNode.offsetTop);
- //这里一定要return false啊,否则,嘿嘿,我不告诉你,你可以拖拖看。
- return false;
- }
-
- this.DragStop = function(e)
- {
- if(!this.indrag)return;
- this.indrag = false;
- this.tmpNode.style.display = 'none';
- ee = e || window.event;
- var target = e.target || e.srcElement;
- if(target.className != 'title')return;
- var x = e.pageX || (e.clientX + (document.documentElement.scrollLeft || document.body.scrollLeft));
- var y = e.pageY || (e.clientY + (document.documentElement.scrollTop || document.body.scrollTop));
-
- //鼠标没移动位置,选择当前节点。
- if(this.x == x && this.y == y)
- {
- this.oSelected = target;
- this.oSelected.style.backgroundColor = '#00ffff';
- return false;
- }
- try{
- if(isOffspring(target.parentNode,this.DragObj))
- {
- alert('Cannot drag to child node.');
- return;
- }
- target.parentNode.appendChild(this.DragObj);
- debug('drag:'+this.DragObj.id+'->'+target.parentNode.id)
- }
- catch(e)
- {
- alert('error!');
- }
- return true;
- }
- this.Draging = function(e)
- {
- if(!this.indrag)return;
- ee = e || window.event;
- var x = e.pageX || (e.clientX + (document.documentElement.scrollLeft || document.body.scrollLeft));
- var y = e.pageY || (e.clientY + (document.documentElement.scrollTop || document.body.scrollTop));
- this.tmpNode.style.left = x+2+'px';
- this.tmpNode.style.top = y+2+'px';
<li style="font-size: 1em; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 38px; padding
>> 留言评论