好久没来了。本来想利用此贴写一些关于表现,行为和结构分离的东西,但是一直没什么时间,而且这段代码写的很匆忙,所以只好另找时间了。代码在IE6,Firefox1.7,Opera9下运行了一下应该没什么错误,如果有什么问题的话希望大家可以提出来。 其中fly函数块借鉴了Bmail的代码 博客邮箱飞来飞去效果演示 var ev={}; var flyDiv="bxAddrFly";//发送的层 var inceptDiv="SendAddress";//负责接收层效果的控件 var addEvent="addAddress()";//层发送成功后的接收事件 function oo(obj){return (document.getElementById) ? document.getElementById(obj): document.all[obj];} function isNone(str){return str==null||str==""?true:false} //=================兼容Firefox/Event================= //因为要将表现与行为分离所在此处浪费了很多代码 var Browser = new Object(); Browser.isFirefox = (navigator.userAgent.toLowerCase().indexOf("firefox")!=-1); if (Browser.isFirefox) { extendEventObject();} function extendEventObject() { window.constructor.prototype.__defineGetter__("event", function(){ var o = arguments.callee.caller; var e; while(o != null){ e = o.arguments[0]; if(e && (e.constructor == Event || e.constructor == MouseEvent)) return e; o = o.caller; } return null; }); Event.prototype.__defineGetter__("srcElement", function () { var node = this.target; while (node.nodeType != 1) node = node.parentNode; return node; }); } window.onload = function(){ var addrTree = oo('tbAddrTree'); addrTree.onmouseover = function(){addrTree_event(event)}; addrTree.onmouseout = function(){addrTree_event(event)}; addrTree.onclick = function(){addrTree_event(event)}; } function addrTree_event(e){ var memberID,tr var ee = e.srcElement; if(ee.tagName=="A"&&e.type=="mouseover"){ee.style.textDecoration="underline"} if(ee.tagName=="A"&&e.type=="mouseout"){ee.style.textDecoration=""} if(e.type=="click"&&e.srcElement.tagName=="A"){ var li=ee.parentNode.parentNode; ev.AddInfo="\""+li.getAttribute("memberName")+"\"<\""+li.getAttribute("email")+"\">" oo(flyDiv).innerHTML=li.getAttribute("memberName"); addrTree_add(e.clientX,e.clientY) } } function addrTree_add(ex,ey){ if(oo(flyDiv).style.display=='none'){oo(flyDiv).style.display=''} //此处获取控件的坐标 var inceptE = oo(inceptDiv); var inceptEX = inceptE.offsetTop; var inceptEY = inceptE.offsetLeft; while(inceptE = inceptE.offsetParent){ inceptEX += inceptE.offsetTop; inceptEY += inceptE.offsetLeft; } ev.flyArr=new Array(ex,ey,inceptEX,inceptEY,10); fly(flyDiv,addEvent); } // function fly(flyObj,flyRun){ var obj,a=ev.flyArr,x,y if(flyObj!=null){ if(ev.flyObj!=null){ window.clearTimeout(ev.flyTm); ev.flyObj.style.top=-900; } a[5]=0; ev.flyObj=oo(flyObj); ev.flyRun=flyRun; } obj=ev.flyObj; if(a[4]==null){a[4]=1} a[5]+=a[4]/Math.sqrt(Math.pow(a[2]-a[0],2)+Math.pow(a[3]-a[1],2)); if(a[5]>1){ obj.style.top=-900; eval(ev.flyRun); ev.flyObj=null; return; } window.clearTimeout(ev.flyTm); x=(a[2]-a[0])*a[5]+a[0]; y=(a[3]-a[1])*a[5]+a[1]; obj.style.left=x; obj.style.top=y; document.body.style.overflowX="hidden"; ev.flyTm=window.setTimeout("fly()",10) } //事件处理 function addAddress() { var key=ev.AddInfo; if (oo(inceptDiv).value.indexOf(key)==-1) { oo(inceptDiv).value+=key+","; } } ul{ list-style:none; margin:0; padding:0;} li{ margin:0; padding:0;} #content{width:100%;} #sendmail{float:left; width:60%;} #friendlist{float:left; width:30%;} #bxAddrFly{position:absolute;height:15px; width:50px;background:#e5edf6; border:1px #7F9DB9 solid;} #tbAddrTree{ width:190px; float:left; padding:4px;border:1px #7F9DB9 solid;} #tbAddrTree li{ width:100%; float:left;} #tbAddrTree a{backgroud: #fff;width: 100%;color:#494949;text-decoration: none;float:left;} #tbAddrTree a:hover{background: #e5edf6} test0 test1 test2 test3 test4 test5 test6 test7 [Ctrl+A 全选 注:如需引入外部Js需刷新才能执行]