拖动DIV框架效果保存的问题
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=gb2312"> <title>Drag & Drop</title> <style type="text/css"> body{ background-color:#36393D; font-size:12px; margin:0px; } DIV.dragLayer{ border:1px solid #369; background-color:#6BBA70; margin-bottom:10px; } DIV.dragLayer_over{ border:1px solid #C79810; background-color:#6BBA70; filter:alpha(opacity=80); -moz-opacity:0.8; /* Moz + FF */ opacity: 0.8; /* 支持CSS3的浏览器(FF 1.5也支持)*/ } DIV.clone_dragLayer_over{ border:1px dashed #FA0; background-color:#6BBA70; filter:alpha(opacity=80); -moz-opacity:0.8; /* Moz + FF */ opacity: 0.8; /* 支持CSS3的浏览器(FF 1.5也支持)*/ margin-bottom:10px; } DIV.dragHeader{ width:100%; height:20px ; line-height:20px; background-color:#006E2E; color:#FFFFFF; } DIV.dragHeader_over{ width:100%; height:20px ; line-height:20px; background-color:#C79810; } SPAN.min,SPAN.close{cursor:pointer;font-family:Webdings} #container{margin:0px} #leftcontainer{float:left; width:33%;} #middlecontainer{float:left; width:34%;} #middlecontainer div{margin-left:auto; margin-right:auto} #rightcontainer{float:right; width:33%;} #rightcontainer div{float:right} DIV.content{width:100%; padding:4px} </style> <script type="text/javascript"> var CoolDrag={ obj : null, //目标对象 cloneobj : null, //拖动对象 container : null, //容器 dragged : false, //拖动标志 shadow: null, //阴影 init:function(id){ CoolDrag.container = $(id); var cooldrag = CoolDrag.read("cooldrag"); if(cooldrag != ""){//读取cookie var subcontainer = cooldrag.split("|"); for(var i=0 ; i < subcontainer.length; i++){ var subcontainerItem = subcontainer<span style="text-decoration: line-through;">.split(":"); if($(subcontainerItem[0])){ var items = subcontainerItem[1].split(","); for(var j=0; j< items.length; j++){ if($(items[j])) $(subcontainerItem[0]).appendChild($(items[j])); } } } } cleanWhitespace(CoolDrag.container)//清除空白节点 var collection = CoolDrag.container.getElementsByTagName("DIV"); for(var i = 0; i < collection.length; i++){ if(collection<span style="text-decoration: line-through;">.className == "dragLayer"){ var o = collection<span style="text-decoration: line-through;">.firstChild; SavedObject.push([o.parentNode.id,1,o.parentNode.style.height]); o.onmousedown = CoolDrag.start; } } document.onmousemove = CoolDrag.drag; document.onmouseup = CoolDrag.end; }, start:function(e){ if(!e) e = window.event; var obj = getT(e); if(obj.className == "min"){ CoolDrag.min(e); return; }else if(obj.className == "close"){ CoolDrag.close(e); return; }else{ if(obj.className != "dragHeader") obj = obj.parentNode; } CoolDrag.dragged = true; CoolDrag.obj = obj.parentNode; CoolDrag.cloneobj = CoolDrag.obj.cloneNode(true); document.body.appendChild(CoolDrag.cloneobj); CoolDrag.shadow = document.createElement("DIV"); document.body.appendChild(CoolDrag.shadow); with(CoolDrag.cloneobj.style){ position = "absolute"; zIndex = 1000; left = getRealLeft(CoolDrag.obj) + "px"; top = getRealTop(CoolDrag.obj) + "px"; } with(CoolDrag.shadow.style){ position = "absolute"; zIndex = 999; left = getRealLeft(CoolDrag.obj) + 4 + "px"; top = getRealTop(CoolDrag.obj) + 4 + "px"; width = CoolDrag.obj.offsetWidth + "px"; height = CoolDrag.obj.offsetHeight + "px"; backgroundColor = "#ccc"; if(navigator.userAgent.indexOf("Gecko") != -1) MozOpacity = "0.5"; else if(navigator.userAgent.indexOf("MSIE") != -1) filter = "alpha(opacity=50)"; } CoolDrag.cloneobj.initMouseX = getMouseX(e); CoolDrag.cloneobj.initMouseY = getMouseY(e); CoolDrag.cloneobj.initoffsetL = getRealLeft(CoolDrag.obj); CoolDrag.cloneobj.initoffsetY = getRealTop(CoolDrag.obj); //change style CoolDrag.cloneobj.firstChild.className="dragHeader_over"; CoolDrag.cloneobj.className = "dragLayer_over"; CoolDrag.obj.className="clone_dragLayer_over"; }, drag:function(e){ if(!CoolDrag.dragged||CoolDrag.obj==null)return; if(!e) e = window.event; var currenX = getMouseX(e); var currenY = getMouseY(e); if(CoolDrag.cloneobj.initoffsetL + currenX - CoolDrag.cloneobj.initMouseX > getRealLeft(CoolDrag.container)) CoolDrag.cloneobj.style.left = (CoolDrag.cloneobj.initoffsetL + currenX - CoolDrag.cloneobj.initMouseX) + "px"; else CoolDrag.cloneobj.style.left = getRealLeft(CoolDrag.container) + "px"; if(CoolDrag.cloneobj.initoffsetY + currenY - CoolDrag.cloneobj.initMouseY > getRealTop(CoolDrag.container)) CoolDrag.cloneobj.style.top = (CoolDrag.cloneobj.initoffsetY + currenY - CoolDrag.cloneobj.initMouseY) + "px"; else CoolDrag.cloneobj.style.top = getRealTop(CoolDrag.container) + "px"; var collection = CoolDrag.container.getElementsByTagName("DIV"); var finded = false; for(var i = 0; i < collection.length; i++){ var o = collection<span style="text-decoration: line-through;">; if(o.className == "dragLayer"){ if(((getRealLeft(o) <= CoolDrag.cloneobj.offsetLeft && getRealLeft(o) + o.offsetWidth >= CoolDrag.cloneobj.offsetLeft) || (getRealLeft(o) <= CoolDrag.cloneobj.offsetLeft + CoolDrag.cloneobj.offsetWidth && getRealLeft(o) + o.offsetWidth >= CoolDrag.cloneobj.offsetLeft + CoolDrag.cloneobj.offsetWidth)) && getRealTop(o) <= CoolDrag.cloneobj.offsetTop && getRealTop(o) + o.offsetHeight >= CoolDrag.cloneobj.offsetTop) { //window.status = getRealTop(o.parentNode)+"|"+(CoolDrag.cloneobj.offsetTop - 8); if(getRealTop(o.parentNode) >= CoolDrag.cloneobj.offsetTop - 8){ o.parentNode.insertBefore(CoolDrag.obj,o); }else{ if(o.nextSibling) o.parentNode.insertBefore(CoolDrag.obj,o.nextSibling); else o.parentNode.appendChild(CoolDrag.obj); } finded = true; break; } } } if(!finded){ for(var i = 0; i < CoolDrag.container.childNodes.length; i++){ var o = CoolDrag.container.childNodes<span style="text-decoration: line-through;">; if(getRealLeft(o) <= CoolDrag.cloneobj.offsetLeft && getRealLeft(o) + o.offsetWidth >= CoolDrag.cloneobj.offsetLeft) o.appendChild(CoolDrag.obj); } } with(CoolDrag.shadow.style){ left = (CoolDrag.cloneobj.offsetLeft + 4) + "px"; top = (CoolDrag.cloneobj.offsetTop + 4) + "px"; } //document.title = CoolDrag.cloneobj.style.left + "|" + CoolDrag.shadow.style.left; }, end:function(e){ if(!CoolDrag.dragged)return; CoolDrag.obj.className = "dragLayer"; CoolDrag.dragged = false; CoolDrag.shadow.parentNode.removeChild(CoolDrag.shadow); CoolDrag.timer = CoolDrag.repos(150,15); //保存cookie var str=""; for(var i=0; i<CoolDrag.container.childNodes.length; i++){ var o = CoolDrag.container.childNodes<span style="text-decoration: line-through;">; if(i>0)str += "|"; str += o.id + ":"; for(var j=0; j < o.childNodes.length; j++){ if(j>0)str += ","; str += o.childNodes[j].id ; } } CoolDrag.save("cooldrag",str,24); }, repos:function(aa,ab){ //var f=CoolDrag.obj.filters.alpha.opacity; var tl=getRealLeft(CoolDrag.cloneobj); var tt=getRealTop(CoolDrag.cloneobj); var kl=(tl-getRealLeft(CoolDrag.obj))/ab; var kt=(tt-getRealTop(CoolDrag.obj))/ab; //var kf=f/ab; return setInterval(function(){if(ab<1){ clearInterval(CoolDrag.timer); CoolDrag.cloneobj.parentNode.removeChild(CoolDrag.cloneobj); CoolDrag.obj=null; return; } ab--; tl-=kl; tt-=kt; //f-=kf; CoolDrag.cloneobj.style.left=parseInt(tl)+"px"; CoolDrag.cloneobj.style.top=parseInt(tt)+"px"; //CoolDrag.tdiv.filters.alpha.opacity=f; } ,aa/ab) }, min:function(e){ if(!e) e = window.event; var obj = getT(e); var rootObj = obj.parentNode.parentNode.parentNode; var id = rootObj.id; if(SavedObject.getStatus(id)[1]){ SavedObject.setStatus(id,0); rootObj.style.height = "20px"; rootObj.childNodes[1].style.display = 'none'; }else{ SavedObject.setStatus(id,1); rootObj.lastChild.style.display = ''; rootObj.style.height = SavedObject.getStatus(id)[2]; } obj.innerHTML = obj.innerHTML==0 ? 2 :0; }, close:function(e){ if(!e) e = window.event; var obj = getT(e); var rootObj = obj.parentNode.parentNode.parentNode; rootObj.parentNode.removeChild(rootObj); }, save:function(name, value, hours){ var expire = ""; if(hours != null) { expire = new Date((new Date()).getTime() + hours * 3600000); expire = "; expires=" + expire.toGMTString(); } document.cookie = name + "=" + escape(value) + expire; }, read:function(name){ var cookieValue = ""; var search = name + "="; if(document.cookie.length > 0) { offset = document.cookie.indexOf(search); if (offset != -1) { offset += search.length; end = document.cookie.indexOf(";", offset); if (end == -1) end = document.cookie.length; cookieValue = unescape(document.cookie.substring(offset, end)) } } return cookieValue; } } function $(id){ return document.getElementById(id); } function getT(e){ return e.target || e.srcElement; } function getMouseX(e){ return e.pageX ? e.pageX : e.clientX + document.body.scrollLeft - document.body.clientLeft; } function getMouseY(e){ return e.pageY ? e.pageY : e.clientY + document.body.scrollTop - document.body.clientTop; } function getRealLeft(o){ var l = 0; while(o){ l += o.offsetLeft - o.scrollLeft; o = o.offsetParent; } return(l); } function getRealTop(o){ var t = 0; while(o){ t += o.offsetTop - o.scrollTop; o = o.offsetParent; } return(t); } function cleanWhitespace(node) { var notWhitespace = /S/; for (var i=0; i < node.childNodes.length; i++) { var childNode = node.childNodes<span style="text-decoration: line-through;">; if ((childNode.nodeType == 3) && (!notWhitespace.test(childNode.nodeValue))) { node.removeChild(node.childNodes<span style="text-decoration: line-through;">); i--; } if (childNode.nodeType == 1) { cleanWhitespace(childNode); } } } var SavedObject={ elements : new Array(), setStatus : function(id,s){ for(var i=0;i<SavedObject.elements.length;i++){ if(SavedObject.elements<span style="text-decoration: line-through;">[0]==id){ SavedObject.elements<span style="text-decoration: line-through;">[1]=s; break; } } }, getStatus : function(id){ for(var i=0;i<SavedObject.elements.length;i++){ if(SavedObject.elements<span style="text-decoration: line-through;">[0]==id)return SavedObject.elements<span style="text-decoration: line-through;">; } }, push : function(o){ SavedObject.elements[SavedObject.elements.length]=o; } } </script> </head> <body onLoad="CoolDrag.init('container');"> <br /> <div id="container"> <div id="leftcontainer"> <div style="height:100px; width:200px; " class="dragLayer" id="win1"> <div class="dragHeader"> <div style="float:left">第一个窗口</div> <div style="float:right; "><span class="min">0</span><span class="close">r</span></div> </div> <div class="content">window 1</div> </div> <div style="height:100px; width:200px; " class="dragLayer" id="win2"> <div class="dragHeader"> <div style="float:left">第二个窗口</div> <div style="float:right; "><span class="min">0</span><span class="close">r</span></div> </div> <div class="content">window 2</div> </div> </div> <div id="middlecontainer"> <div style="height:100px; width:200px; " class="dragLayer" id="win3"> <div class="dragHeader"> <div style="float:left">第三个窗口</div> <div style="float:right; "><span class="min">0</span><span class="close">r</span></div> </div> <div class="content">window 3</div> </div> <div style="height:100px; width:200px; " class="dragLayer" id="win4"> <div class="dragHeader"> <div style="float:left">第四个窗口</div> <div style="float:right; "><span class="min">0</span><span class="close">r</span></div> </div> <div class="content">window 4</div> </div> </div> <div id="rightcontainer"> <div style="height:100px; width:200px; " class="dragLayer" id="win5"> <div class="dragHeader"> <div style="float:left">第五个窗口</div> <div style="float:right; "><span class="min">0</span><span class="close">r</span></div> </div> <div class="content">window 5</div> </div> <div style="height:100px; width:200px; " class="dragLayer" id="win6"> <div class="dragHeader"> <div style="float:left">第六个窗口</div> <div style="float:right; "><span class="min">0</span><span class="close">r</span></div> </div> <div class="content">window 6</div> </div> <div style="height:100px; width:200px; " class="dragLayer" id="win7"> <div class="dragHeader"> <div style="float:left">第七个窗口</div> <div style="float:right; "><span class="min">0</span><span class="close">r</span></div> </div> <div class="content">window 7</div> </div> </div> </div> </body> </html>