오랜만이에요. 원래는 이 게시물을 사용하여 성능, 동작 및 구조의 분리에 대한 내용을 작성하고 싶었지만 시간이 없었고 이 코드는 급하게 작성되었기 때문에 다른 기회를 찾아야 했습니다. 코드는 IE6, Firefox1.7, Opera9에서 실행되었으며 오류가 없을 것입니다. 문제가 있으면 문의해 주시기 바랍니다. 플라이 기능 블록은 Bmail의 코드를 차용했습니다 블로그 우편함 날아다니는 효과 시연 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} 테스트0 테스트1 테스트2 테스트3 테스트4 테스트5 테스트6 테스트7 [Ctrl A 모두 선택 참고: 외부 J를 도입해야 하는 경우 실행하려면 새로 고쳐야 합니다 ] 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+","; } }