Tin's Blog

          You are coming a long way, baby~Thinking, feeling, memory...

            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
            128 隨筆 :: 0 文章 :: 221 評(píng)論 :: 0 Trackbacks
          這兩天太忙了,沒時(shí)間寫B(tài)log,業(yè)余時(shí)間又扒了一次google的拖拽,對(duì)比了netvibes的,差不多,讓后就寫了個(gè)注釋,順便學(xué)習(xí)。
          google用了混淆,js里面的命名比較暈。我花了些時(shí)間把他們翻譯成容易看懂的命名,并且作了注釋,希望對(duì)大家有幫助。
          可以這里下載我的例子:
          http://www.aygfsteel.com/Files/iamtin/google_drag.rar

          // 工具類,使用Util的命名空間,方便管理
          var ?Util? = ? new ?Object();
          // 獲取http?header里面的UserAgent,瀏覽器信息
          Util.getUserAgent? = ?navigator.userAgent;
          // 是否是Gecko核心的Browser,比如Mozila、Firefox
          Util.isGecko? = ?Util.getUserAgent.indexOf( " Gecko " )? != ? - 1 ;
          // 是否是Opera
          Util.isOpera? = ?Util.getUserAgent.indexOf( " Opera " )? != ? - 1 ;
          // 獲取一個(gè)element的offset信息,其實(shí)就是相對(duì)于Body的padding以內(nèi)的絕對(duì)坐標(biāo)
          //
          后面一個(gè)參數(shù)如果是true則獲取offsetLeft,false則是offsetTop
          //
          關(guān)于offset、style、client等坐標(biāo)的定義參考dindin的這個(gè)帖子:http://www.jroller.com/page/dindin/?anchor=pro_javascript_12
          Util.getOffset? = ? function ?(el,?isLeft)?{
          ????
          var ?retValue? = ? 0 ;
          ????
          while ?(el? != ? null )?{
          ????????retValue?
          += ?el[ " offset " ? + ?(isLeft? ? ? " Left " ?:? " Top " )];
          ????????el?
          = ?el.offsetParent;
          ????}
          ????
          return ?retValue;
          };
          // 將一個(gè)function(參數(shù)中的funcName是這個(gè)fuction的名字)綁定到一個(gè)element上,并且以這個(gè)element的上下文運(yùn)行,其實(shí)是一種繼承,這個(gè)可以google些文章看看
          Util.bindFunction? = ? function ?(el,?fucName)?{
          ????
          return ? function ?()?{
          ????????
          return ?el[fucName].apply(el,?arguments);
          ????};
          };
          // 重新計(jì)算所有的可以拖拽的element的坐標(biāo),對(duì)同一個(gè)column下面的可拖拽圖層重新計(jì)算它們的高度而得出新的坐標(biāo),防止遮疊
          //
          計(jì)算出來的坐標(biāo)記錄在pagePosLeft和pagePosTop兩個(gè)屬性里面
          Util.re_calcOff? = ? function ?(el)?{
          ????
          for ?( var ?i? = ? 0 ;?i? < ?Util.dragArray.length;?i ++ )?{
          ????????
          var ?ele? = ?Util.dragArray[i];
          ????????ele.elm.pagePosLeft?
          = ?Util.getOffset(ele.elm,? true );
          ????????ele.elm.pagePosTop?
          = ?Util.getOffset(ele.elm,? false );
          ????}
          ????
          var ?nextSib? = ?el.elm.nextSibling;
          ????
          while ?(nextSib)?{
          ????????nextSib.pagePosTop?
          -= ?el.elm.offsetHeight;
          ????????nextSib?
          = ?nextSib.nextSibling;
          ????}
          };

          // 隱藏Google?Ig中間那個(gè)table,也就是拖拽的容器,配合show一般就是刷新用,解決一些瀏覽器的怪癖
          Util.hide? = ? function ?()?{
          ????Util.rootElement.style.display?
          = ? " none " ;
          };
          // 顯示Google?Ig中間那個(gè)table,解釋同上
          Util.show? = ? function ?()?{
          ????Util.rootElement.style.display?
          = ? "" ;
          };

          // 移動(dòng)時(shí)顯示的占位虛線框
          ghostElement? = ? null ;
          // 獲取這個(gè)虛線框,通過dom動(dòng)態(tài)生成
          getGhostElement? = ? function ?()?{
          ????
          if ?( ! ghostElement)?{
          ????????ghostElement?
          = ?document.createElement( " DIV " );
          ????????ghostElement.className?
          = ? " modbox " ;
          ????????ghostElement.backgroundColor?
          = ? "" ;
          ????????ghostElement.style.border?
          = ? " 2px?dashed?#aaa " ;
          ????????ghostElement.innerHTML?
          = ? " &nbsp; " ;
          ????}
          ????
          return ?ghostElement;
          };

          // 初始化可以拖拽的Element的函數(shù),與拖拽無關(guān)的我去掉了
          function ?draggable(el)?{
          ????
          // 公用的開始拖拽的函數(shù)
          ???? this ._dragStart? = ?start_Drag;
          ????
          // 公用的正在拖拽的函數(shù)
          ???? this ._drag? = ?when_Drag;
          ????
          // 公用的拖拽結(jié)束的函數(shù)
          ???? this ._dragEnd? = ?end_Drag;
          ????
          // 這個(gè)函數(shù)主要用來進(jìn)行拖拽結(jié)束后的dom處理
          ???? this ._afterDrag? = ?after_Drag;
          ????
          // 是否正在被拖動(dòng),一開始當(dāng)然沒有被拖動(dòng)
          ???? this .isDragging? = ? false ;
          ????
          // 將這個(gè)Element的this指針注冊(cè)在elm這個(gè)變量里面,方便在自己的上下文以外調(diào)用自己的函數(shù)等,很常用的方法
          ???? this .elm? = ?el;
          ????
          // 觸發(fā)拖拽的Element,在這里就是這個(gè)div上顯示標(biāo)題的那個(gè)div
          ???? this .header? = ?document.getElementById(el.id? + ? " _h " );
          ????
          // 對(duì)于有iframe的element拖拽不同,這里檢測(cè)一下并記錄
          ???? this .hasIFrame? = ? this .elm.getElementsByTagName( " IFRAME " ).length? > ? 0 ;
          ????
          // 如果找到了header就綁定drag相關(guān)的event
          ???? if ?( this .header)?{
          ????????
          // 拖拽時(shí)的叉子鼠標(biāo)指針
          ???????? this .header.style.cursor? = ? " move " ;
          ????????
          // 將函數(shù)綁定到header和element的this上,參照那個(gè)函數(shù)的說明
          ????????Drag.init( this .header,? this .elm);
          ????????
          // 下面三個(gè)語句將寫好的三個(gè)函數(shù)綁定給這個(gè)elemnt的三個(gè)函數(shù)鉤子上,也就實(shí)現(xiàn)了element從draggable繼承可拖拽的函數(shù)
          ???????? this .elm.onDragStart? = ?Util.bindFunction( this ,? " _dragStart " );
          ????????
          this .elm.onDrag? = ?Util.bindFunction( this ,? " _drag " );
          ????????
          this .elm.onDragEnd? = ?Util.bindFunction( this ,? " _dragEnd " );
          ????}
          };

          // 下面就是draggable里面用到的那4個(gè)function
          //
          公用的開始拖拽的函數(shù)
          function ?start_Drag()?{
          ????
          // 重置坐標(biāo),實(shí)現(xiàn)拖拽以后自己的位置馬上會(huì)被填充的效果
          ????Util.re_calcOff( this );
          ????
          // 記錄原先的鄰居節(jié)點(diǎn),用來對(duì)比是否被移動(dòng)到新的位置
          ???? this .origNextSibling? = ? this .elm.nextSibling;
          ????
          // 獲取移動(dòng)的時(shí)候那個(gè)灰色的虛線框
          ???? var ?_ghostElement? = ?getGhostElement();
          ????
          // 獲取正在移動(dòng)的這個(gè)對(duì)象的高度
          ???? var ?offH? = ? this .elm.offsetHeight;
          ????
          if ?(Util.isGecko)?{
          ????????
          // 修正gecko引擎的怪癖吧
          ????????offH? -= ?parseInt(_ghostElement.style.borderTopWidth)? * ? 2 ;
          ????}
          ????
          // 獲取正在移動(dòng)的這個(gè)對(duì)象的寬度
          ???? var ?offW? = ? this .elm.offsetWidth;
          ????
          // 獲取left和top的坐標(biāo)
          ???? var ?offLeft? = ?Util.getOffset( this .elm,? true );
          ????
          var ?offTop? = ?Util.getOffset( this .elm,? false );
          ????
          // 防止閃爍,現(xiàn)隱藏
          ????Util.hide();
          ????
          // 將自己的寬度記錄在style屬性里面
          ???? this .elm.style.width? = ?offW? + ? " px " ;
          ????
          // 將那個(gè)灰框設(shè)定得與正在拖動(dòng)的對(duì)象一樣高,比較形象
          ????_ghostElement.style.height? = ?offH? + ? " px " ;
          ????
          // 把灰框放到這個(gè)對(duì)象原先的位置上
          ???? this .elm.parentNode.insertBefore(_ghostElement,? this .elm.nextSibling);
          ????
          // 由于要拖動(dòng)必須將被拖動(dòng)的對(duì)象從原先的盒子模型里面抽出來,所以設(shè)定position為absolute,這個(gè)可以參考一下css布局方面的知識(shí)
          ???? this .elm.style.position? = ? " absolute " ;
          ????
          // 設(shè)置zIndex,讓它處在最前面一層,當(dāng)然其實(shí)zIndex=100是讓它很靠前,如果頁面里有zIndex>100的,那……
          ???? this .elm.style.zIndex? = ? 100 ;
          ????
          // 由于position=absolute了,所以left和top實(shí)現(xiàn)絕對(duì)坐標(biāo)定位,這就是先前計(jì)算坐標(biāo)的作用,不讓這個(gè)模型亂跑,要從開始拖動(dòng)的地方開始移動(dòng)
          ???? this .elm.style.left? = ?offLeft? + ? " px " ;
          ????
          this .elm.style.top? = ?offTop? + ? " px " ;
          ????
          // 坐標(biāo)設(shè)定完畢,可以顯示了,這樣就不會(huì)閃爍了
          ????Util.show();
          ????
          // 這里本來有個(gè)ig_d.G,沒搞明白干什么用的,不過沒有也可以用,誰知道麻煩告訴我一聲,不好意思
          ???? // 還沒有開始拖拽,這里做個(gè)記號(hào)
          ???? this .isDragging? = ? false ;
          ????
          return ? false ;
          };
          // 在拖拽時(shí)的相應(yīng)函數(shù),由于綁定到鼠標(biāo)的move這個(gè)event上,所以會(huì)傳入鼠標(biāo)的坐標(biāo)clientX,?clientY
          function ?when_Drag(clientX,?clientY)?{
          ????
          // 剛開始拖拽的時(shí)候?qū)D層變透明,并標(biāo)記為正在被拖拽
          ???? if ?( ! this .isDragging)?{
          ????????
          this .elm.style.filter? = ? " alpha(opacity=70) " ;
          ????????
          this .elm.style.opacity? = ? 0.7 ;
          ????????
          this .isDragging? = ? true ;
          ????}
          ????
          // 被拖拽到的新的column(當(dāng)然也可以是原來那個(gè))
          ???? var ?found? = ? null ;
          ????
          // 最大的距離,可能是防止溢出或者什么bug
          ???? var ?max_distance? = ? 100000000 ;
          ????
          // 遍歷所有的可拖拽的element,尋找離當(dāng)前鼠標(biāo)坐標(biāo)最近的那個(gè)可拖拽元素,以便后面插入
          ???? for ?( var ?i? = ? 0 ;?i? < ?Util.dragArray.length;?i ++ )?{
          ????????
          var ?ele? = ?Util.dragArray[i];
          ????????
          // 利用勾股定理計(jì)算鼠標(biāo)到遍歷到的這個(gè)元素的距離
          ???????? var ?distance? = ?Math.sqrt(Math.pow(clientX? - ?ele.elm.pagePosLeft,? 2 )? + ?Math.pow(clientY? - ?ele.elm.pagePosTop,? 2 ));
          ????????
          // 自己已經(jīng)浮動(dòng)了,所以不計(jì)算自己的
          ???????? if ?(ele? == ? this )?{
          ????????????
          continue ;
          ????????}
          ????????
          // 如果計(jì)算失敗繼續(xù)循環(huán)
          ???????? if ?(isNaN(distance))?{
          ????????????
          continue ;
          ????????}
          ????????
          // 如果更小,記錄下這個(gè)距離,并將它作為found
          ???????? if ?(distance? < ?max_distance)?{
          ????????????max_distance?
          = ?distance;
          ????????????found?
          = ?ele;
          ????????}
          ????}
          ????
          // 準(zhǔn)備讓灰框落腳
          ???? var ?_ghostElement? = ?getGhostElement();
          ????
          // 如果找到了另外的落腳點(diǎn)
          ???? if ?(found? != ? null ? && ?_ghostElement.nextSibling? != ?found.elm)?{
          ????????
          // 找到落腳點(diǎn)就先把灰框插進(jìn)去,這就是我們看到的那個(gè)灰框停靠的特效,有點(diǎn)像吸附的感覺,哈哈
          ????????found.elm.parentNode.insertBefore(_ghostElement,?found.elm);
          ????????
          if ?(Util.isOpera)?{
          ????????????
          // Opera的現(xiàn)實(shí)問題,要隱藏/顯示后才能刷新出變化
          ????????????document.body.style.display? = ? " none " ;
          ????????????document.body.style.display?
          = ? "" ;
          ????????}
          ????}
          };
          // 拖拽完畢
          function ?end_Drag()?{
          ????
          // 拖拽完畢后執(zhí)行后面的鉤子,執(zhí)行after_Drag(),如果布局發(fā)生了變動(dòng)了就記錄到遠(yuǎn)程服務(wù)器,保存你拖拽后新的布局順序
          ???? if ?( this ._afterDrag())?{
          ????????
          // remote?call?to?save?the?change
          ????}
          ????
          return ? true ;
          };
          // 拖拽后的執(zhí)行鉤子
          function ?after_Drag()?{
          ????
          var ?returnValue? = ? false ;
          ????
          // 防止閃爍
          ????Util.hide();
          ????
          // 把拖拽時(shí)的position=absolute和相關(guān)的那些style都消除
          ???? this .elm.style.position? = ? "" ;
          ????
          this .elm.style.width? = ? "" ;
          ????
          this .elm.style.zIndex? = ? "" ;
          ????
          this .elm.style.filter? = ? "" ;
          ????
          this .elm.style.opacity? = ? "" ;
          ????
          // 獲取灰框
          ???? var ?ele? = ?getGhostElement();
          ????
          // 如果現(xiàn)在的鄰居不是原來的鄰居了
          ???? if ?(ele.nextSibling? != ? this .origNextSibling)?{
          ????????
          // 把被拖拽的這個(gè)節(jié)點(diǎn)插到灰框的前面
          ????????ele.parentNode.insertBefore( this .elm,?ele.nextSibling);
          ????????
          // 標(biāo)明被拖拽了新的地方
          ????????returnValue? = ? true ;
          ????}
          ????
          // 移除灰框,這是這個(gè)灰框的生命周期應(yīng)該就結(jié)束了
          ????ele.parentNode.removeChild(ele);
          ????
          // 修改完畢,顯示
          ????Util.show();
          ????
          if ?(Util.isOpera)?{
          ????????
          // Opera的現(xiàn)實(shí)問題,要隱藏/顯示后才能刷新出變化
          ????????document.body.style.display? = ? " none " ;
          ????????document.body.style.display?
          = ? "" ;
          ????}
          ????
          return ?returnValue;
          };
          // 可拖拽Element的原形,用來將event綁定到各個(gè)鉤子,這部分市比較通用的,netvibes也是基本完全相同的實(shí)現(xiàn)
          //
          這部分推薦看dindin的這個(gè),也會(huì)幫助理解,http://www.jroller.com/page/dindin/?anchor=pro_javascript_12
          var ?Drag? = ?{
          ????
          // 對(duì)這個(gè)element的引用,一次只能拖拽一個(gè)Element
          ????obj: null ,?
          ????
          // element是被拖拽的對(duì)象的引用,elementHeader就是鼠標(biāo)可以拖拽的區(qū)域
          ????init: function ?(elementHeader,?element)?{
          ????????
          // 將start綁定到onmousedown事件,按下鼠標(biāo)觸發(fā)start
          ????????elementHeader.onmousedown? = ?Drag.start;
          ????????
          // 將element存到header的obj里面,方便header拖拽的時(shí)候引用
          ????????elementHeader.obj? = ?element;
          ????????
          // 初始化絕對(duì)的坐標(biāo),因?yàn)椴皇莗osition=absolute所以不會(huì)起什么作用,但是防止后面onDrag的時(shí)候parse出錯(cuò)了
          ???????? if ?(isNaN(parseInt(element.style.left)))?{
          ????????????element.style.left?
          = ? " 0px " ;
          ????????}
          ????????
          if ?(isNaN(parseInt(element.style.top)))?{
          ????????????element.style.top?
          = ? " 0px " ;
          ????????}
          ????????
          // 掛上空Function,初始化這幾個(gè)成員,在Drag.init被調(diào)用后才幫定到實(shí)際的函數(shù),可以參照draggable里面的內(nèi)容
          ????????element.onDragStart? = ? new ?Function();
          ????????element.onDragEnd?
          = ? new ?Function();
          ????????element.onDrag?
          = ? new ?Function();
          ????},
          ????
          // 開始拖拽的綁定,綁定到鼠標(biāo)的移動(dòng)的event上
          ????start: function ?(event)?{
          ????????
          var ?element? = ?Drag.obj? = ? this .obj;
          ????????
          // 解決不同瀏覽器的event模型不同的問題
          ????????event? = ?Drag.fixE(event);
          ????????
          // 看看是不是左鍵點(diǎn)擊
          ???????? if ?(event.which? != ? 1 )?{
          ????????????
          // 除了左鍵都不起作用
          ???????????? return ? true ;
          ????????}
          ????????
          // 參照這個(gè)函數(shù)的解釋,掛上開始拖拽的鉤子
          ????????element.onDragStart();
          ????????
          // 記錄鼠標(biāo)坐標(biāo)
          ????????element.lastMouseX? = ?event.clientX;
          ????????element.lastMouseY?
          = ?event.clientY;
          ????????
          // 將Global的event綁定到被拖動(dòng)的element上面來
          ????????document.onmouseup? = ?Drag.end;
          ????????document.onmousemove?
          = ?Drag.drag;
          ????????
          return ? false ;
          ????},?
          ????
          // Element正在被拖動(dòng)的函數(shù)
          ????drag: function ?(event)?{
          ????????
          // 解決不同瀏覽器的event模型不同的問題
          ????????event? = ?Drag.fixE(event);
          ????????
          // 看看是不是左鍵點(diǎn)擊
          ???????? if ?(event.which? == ? 0 )?{
          ????????????
          // 除了左鍵都不起作用
          ???????????? return ?Drag.end();
          ????????}
          ????????
          // 正在被拖動(dòng)的Element
          ???????? var ?element? = ?Drag.obj;
          ????????
          // 鼠標(biāo)坐標(biāo)
          ???????? var ?_clientX? = ?event.clientY;
          ????????
          var ?_clientY? = ?event.clientX;
          ????????
          // 如果鼠標(biāo)沒動(dòng)就什么都不作
          ???????? if ?(element.lastMouseX? == ?_clientY? && ?element.lastMouseY? == ?_clientX)?{
          ????????????
          return ? false ;
          ????????}
          ????????
          // 剛才Element的坐標(biāo)
          ???????? var ?_lastX? = ?parseInt(element.style.top);
          ????????
          var ?_lastY? = ?parseInt(element.style.left);
          ????????
          // 新的坐標(biāo)
          ???????? var ?newX,?newY;
          ????????
          // 計(jì)算新的坐標(biāo):原先的坐標(biāo)+鼠標(biāo)移動(dòng)的值差
          ????????newX? = ?_lastY? + ?_clientY? - ?element.lastMouseX;
          ????????newY?
          = ?_lastX? + ?_clientX? - ?element.lastMouseY;
          ????????
          // 修改element的顯示坐標(biāo)
          ????????element.style.left? = ?newX? + ? " px " ;
          ????????element.style.top?
          = ?newY? + ? " px " ;
          ????????
          // 記錄element現(xiàn)在的坐標(biāo)供下一次移動(dòng)使用
          ????????element.lastMouseX? = ?_clientY;
          ????????element.lastMouseY?
          = ?_clientX;
          ????????
          // 參照這個(gè)函數(shù)的解釋,掛接上Drag時(shí)的鉤子
          ????????element.onDrag(newX,?newY);
          ????????
          return ? false ;
          ????},
          ????
          // Element正在被釋放的函數(shù),停止拖拽
          ????end: function ?(event)?{
          ????????
          // 解決不同瀏覽器的event模型不同的問題
          ????????event? = ?Drag.fixE(event);
          ????????
          // 解除對(duì)Global的event的綁定
          ????????document.onmousemove? = ? null ;
          ????????document.onmouseup?
          = ? null ;
          ????????
          // 先記錄下onDragEnd的鉤子,好移除obj
          ???????? var ?_onDragEndFuc? = ?Drag.obj.onDragEnd();
          ????????
          // 拖拽完畢,obj清空
          ????????Drag.obj? = ? null ;
          ????????
          return ?_onDragEndFuc;
          ????},?
          ????
          // 解決不同瀏覽器的event模型不同的問題
          ????fixE: function ?(ig_)?{
          ????????
          if ?( typeof ?ig_? == ? " undefined " )?{
          ????????????ig_?
          = ?window.event;
          ????????}
          ????????
          if ?( typeof ?ig_.layerX? == ? " undefined " )?{
          ????????????ig_.layerX?
          = ?ig_.offsetX;
          ????????}
          ????????
          if ?( typeof ?ig_.layerY? == ? " undefined " )?{
          ????????????ig_.layerY?
          = ?ig_.offsetY;
          ????????}
          ????????
          if ?( typeof ?ig_.which? == ? " undefined " )?{
          ????????????ig_.which?
          = ?ig_.button;
          ????????}
          ????????
          return ?ig_;
          ????}
          };



          // 下面是初始化的函數(shù)了,看看上面這些東西怎么被調(diào)用
          var ?_IG_initDrag? = ? function ?(el)?{
          ????
          // column那個(gè)容器,在google里面就是那個(gè)table布局的tbody,netvibes用的<div>
          ????Util.rootElement? = ?el;
          ????
          // 這個(gè)tbody的行
          ????Util._rows? = ?Util.rootElement.tBodies[ 0 ].rows[ 0 ];
          ????
          // 列,google是3列,其實(shí)也可以更多
          ????Util.column? = ?Util._rows.cells;
          ????
          // 用來存取可拖拽的對(duì)象
          ????Util.dragArray? = ? new ?Array();
          ????
          var ?counter? = ? 0 ;
          ????
          for ?( var ?i? = ? 0 ;?i? < ?Util.column.length;?i ++ )?{
          ????????
          // 搜索所有的column
          ???????? var ?ele? = ?Util.column[i];
          ????????
          for ?( var ?j? = ? 0 ;?j? < ?ele.childNodes.length;?j ++ )?{
          ????????????
          // 搜索每一column里面的所有element
          ???????????? var ?ele1? = ?ele.childNodes[j];
          ????????????
          // 如果是div就把它初始化為一個(gè)draggable對(duì)象
          ???????????? if ?(ele1.tagName? == ? " DIV " )?{
          ????????????????Util.dragArray[counter]?
          = ? new ?draggable(ele1);
          ????????????????counter
          ++ ;
          ????????????}
          ????????}
          ????}
          };

          // google的頁面里可以拖動(dòng)的部分的id是"t_1"
          //
          掛載到onload,載入完畢執(zhí)行。不過實(shí)際上google沒有用onload。
          //
          而是寫在頁面最下面,異曲同工吧,也許直接寫在頁面是種怪癖,或者也有可能是兼容性考慮。

          // 請(qǐng)將下面兩條被注釋掉的代碼加,到你自己下載的一個(gè)google?ig頁面里面,把里面的所有其余script刪除,掛上這個(gè)js也可以拖拽了,哈哈
          //
          _table=document.getElementById("t_1");
          //
          window.onload?=?_IG_initDrag(_table);

          // 其實(shí)看懂這些代碼對(duì)學(xué)習(xí)javascript很有益,希望對(duì)大家能有幫助
          posted on 2006-04-27 22:40 Tin 閱讀(15268) 評(píng)論(34)  編輯  收藏 所屬分類: 非Java

          評(píng)論

          # re: 對(duì)google個(gè)性主頁的拖拽效果的js的完整注釋 2006-05-23 16:20 sillyman
          能否說說怎樣保存,并且和用戶掛鉤,使每個(gè)用戶近來的時(shí)候看到的不一樣。google這塊是怎樣實(shí)現(xiàn)的呢  回復(fù)  更多評(píng)論
            

          # re: 對(duì)google個(gè)性主頁的拖拽效果的js的完整注釋 2006-05-23 16:24 sillyman
          每個(gè)用戶登陸進(jìn)去看到的都是個(gè)性化的界面,這種界面的位置信息我想是應(yīng)該保存在服務(wù)器上的,可是怎樣保存的呢,保存在數(shù)據(jù)庫(kù)里嗎?數(shù)據(jù)庫(kù)的表結(jié)構(gòu)又應(yīng)該是怎樣的呢?  回復(fù)  更多評(píng)論
            

          # re: 對(duì)google個(gè)性主頁的拖拽效果的js的完整注釋 2006-05-24 10:17 Tin
          關(guān)于數(shù)據(jù)保存的問題,其實(shí)并不難,因?yàn)槊看瓮献ЫY(jié)束都回得出該div在哪個(gè)拖拽區(qū)域div里面,順序也可以通過遍歷所在div的childNodes來找到,然后調(diào)用一個(gè)XmlHttpRequest回去保存就可以了。在數(shù)據(jù)庫(kù)里面保存應(yīng)該只保存位置,然后給每個(gè)位置一個(gè)id,這個(gè)id在對(duì)應(yīng)一個(gè)應(yīng)用(即div里面顯示的內(nèi)容)就可以了。可以參考netvibes,它就是一個(gè)id對(duì)應(yīng)一個(gè)rss,div里面顯示rss的內(nèi)容就可以了。XmlHttpRequest只需看看Ajax的相關(guān)書籍就可以了。推薦Ajax修煉之道和Ajax實(shí)戰(zhàn)兩本書。  回復(fù)  更多評(píng)論
            

          # re: 對(duì)google個(gè)性主頁的拖拽效果的js的完整注釋 2006-05-24 14:52 sillyman
          樓主能否百忙之余幫俺寫出個(gè)例子,這方面的知識(shí)實(shí)在是匱乏,叩謝了!公司的頭就想把主頁變成這樣的,真是難為死我了!  回復(fù)  更多評(píng)論
            

          # re: 對(duì)google個(gè)性主頁的拖拽效果的js的完整注釋 2006-05-24 14:54 sillyman
          在網(wǎng)上轉(zhuǎn)了兩天了,也沒找大相應(yīng)的代碼,郁悶死了!  回復(fù)  更多評(píng)論
            

          # re: 對(duì)google個(gè)性主頁的拖拽效果的js的完整注釋 2006-05-24 15:03 sillyman
          我想可以保存在數(shù)據(jù)庫(kù)里,表結(jié)構(gòu)可以這樣定義(用戶ID,行號(hào),列號(hào),應(yīng)用ID),如果數(shù)據(jù)能存成這樣,我想就好做了,可是保存的時(shí)候怎樣得到“行號(hào)、列號(hào)、和應(yīng)用號(hào)”呢?樓主能否幫寫點(diǎn)代碼!  回復(fù)  更多評(píng)論
            

          # re: 對(duì)google個(gè)性主頁的拖拽效果的js的完整注釋 2006-05-24 17:03 Tin
          設(shè)計(jì)嘛,我想就是那樣了。我的注釋版把通訊部分刪掉了。你可以自己研究一下google的js,很快就能明白了,原理非常簡(jiǎn)單的。“行號(hào)、列號(hào)、和應(yīng)用號(hào)”這不是很簡(jiǎn)單么,你可以將div的id設(shè)為數(shù)據(jù)庫(kù)中的應(yīng)用ID。而行號(hào)則從div.parentNode里面獲取,比如把parentNode的ID寫為column1,column2這樣的形式然后substring(6,7)不就獲得了column的號(hào),也就是列號(hào)。而行號(hào)也很簡(jiǎn)單div.parentNode進(jìn)行g(shù)etChildNodes然后遍歷一遍,找到當(dāng)前div所在的位置,然后行號(hào)不就找到了。這幾個(gè)號(hào)都有了不就OK了。
          其實(shí)要實(shí)現(xiàn)這樣的應(yīng)用還是要學(xué)習(xí)一下javascript,否則還是很難寫出來。
          還有Drag也可以通過dojo庫(kù)里面的相應(yīng)的東西實(shí)現(xiàn),那個(gè)可以寫鉤子函數(shù),實(shí)現(xiàn)起來比用google這個(gè)要規(guī)范一些。  回復(fù)  更多評(píng)論
            

          # re: 對(duì)google個(gè)性主頁的拖拽效果的js的完整注釋 2006-05-25 14:52 sillyman
          "我的注釋版把通訊部分刪掉了" 斑竹能否把完整的代碼發(fā)給我,02118@126.com 非常感謝啊! div還不會(huì)用呢,可能很簡(jiǎn)單的問題,對(duì)于我來說都很難啊!:(  回復(fù)  更多評(píng)論
            

          # re: 對(duì)google個(gè)性主頁的拖拽效果的js的完整注釋 2006-07-28 18:21 智商1000
          感謝樓主!
          希望再加深一步的研究并發(fā)表!謝謝!

          附件中注釋是亂碼!  回復(fù)  更多評(píng)論
            

          # re: 對(duì)google個(gè)性主頁的拖拽效果的js的完整注釋 2006-08-15 16:56 ahui4367
          我用了樓主的翻譯的東西,并且用asp.net+sqlserver保存了窗口布局.數(shù)據(jù)表的設(shè)計(jì)我用了2個(gè)表,具體的可以看.
          http://blog.csdn.net/ahui4367/archive/2006/08/15/1066708.aspx  回復(fù)  更多評(píng)論
            

          # re: 對(duì)google個(gè)性主頁的拖拽效果的js的完整注釋 2006-08-16 14:18 BlackSoul
          看來有共同愛好了..我按照他的思路寫了一個(gè)demo..有興趣可以看一下在下的帖子
          http://www.cnblogs.com/BlackSoul/archive/2006/08/14/javascript_drag_google.html

          aspx寫的仿google主頁.用戶信息用xml保存,客戶端寫cookie,cookie使用的是客戶ip地址.
          xml設(shè)置比較簡(jiǎn)單 1.id,2.所屬框架位置,3.rss地址..  回復(fù)  更多評(píng)論
            

          # re: 對(duì)google個(gè)性主頁的拖拽效果的js的完整注釋 2006-10-27 15:50 mmmtoo
          怎么實(shí)現(xiàn)的本地cookie保存啊?  回復(fù)  更多評(píng)論
            

          # re: 對(duì)google個(gè)性主頁的拖拽效果的js的完整注釋 2006-10-27 16:20 mmmtoo
          @BlackSoul
          沒有看到你的cookie保存部分,能提供代碼不?
          mmmtoo@163.com  回復(fù)  更多評(píng)論
            

          # re: 對(duì)google個(gè)性主頁的拖拽效果的js的完整注釋 2006-10-31 15:18 Tin
          不好意思,我沒有注釋那部分。自己看看源代碼吧。我覺得布局的存儲(chǔ)策略可以靈活一點(diǎn),客戶段服務(wù)器端方案都是可以的。  回復(fù)  更多評(píng)論
            

          # re: 對(duì)google個(gè)性主頁的拖拽效果的js的完整注釋 2006-11-02 15:08 dream
          看源碼??看google的源碼和老大的不一樣啊,我也想學(xué)習(xí)學(xué)習(xí)cookie保存部分,老大能提供源碼不?
            回復(fù)  更多評(píng)論
            

          # re: 對(duì)google個(gè)性主頁的拖拽效果的js的完整注釋 2006-11-07 15:58 11
          cookie保存還是沒有搞定啊,樓主是高手,幫忙解決一下啊!學(xué)習(xí)~  回復(fù)  更多評(píng)論
            

          # re: 對(duì)google個(gè)性主頁的拖拽效果的js的完整注釋 2007-03-30 09:44 mxpx
          google_drag這個(gè)腳本有個(gè)bug,即當(dāng)鼠標(biāo)點(diǎn)擊可拖動(dòng)區(qū)域時(shí)(不拖動(dòng)),拖動(dòng)區(qū)域底下會(huì)出現(xiàn)拖動(dòng)時(shí)的陰影(框),而且會(huì)把界面撐開。
          具體見:http://x.discuz.net/attachments/2007/03/350506_200703300944261.png
          請(qǐng)問你知道是什么原因造成的嗎?

          謝謝。  回復(fù)  更多評(píng)論
            

          # re: 對(duì)google個(gè)性主頁的拖拽效果的js的完整注釋 2007-08-29 16:51 black visitor
          不知道是否能很好的支持IE7.0  回復(fù)  更多評(píng)論
            

          # re: 對(duì)google個(gè)性主頁的拖拽效果的js的完整注釋 2007-12-07 12:48 hexuetao
          樓主,真感謝你。
          我想問一下,iGoogle實(shí)際上它是支持"刷新"的,就是說,用戶拖拽后,刷新,用戶拖拽后的布局不會(huì)變化,請(qǐng)問樓主這個(gè)該如何實(shí)現(xiàn)???
          謝謝,等待答復(fù)!  回復(fù)  更多評(píng)論
            

          # re: 對(duì)google個(gè)性主頁的拖拽效果的js的完整注釋[未登錄] 2007-12-10 16:48 Tin
          那個(gè)其實(shí)很簡(jiǎn)單,因?yàn)楦率欠謮K的。分塊更新就不會(huì)破壞布局。
          比如你的布局后的小容器是div,如果你只更新div的innerHTML,那么布局就不會(huì)變。
          我這個(gè)注釋非常古老了,大家如果看DragDrop的代碼可以去看Script.aculo.us或者JQuery或者moo.fx里面的實(shí)現(xiàn),估計(jì)更有收獲。  回復(fù)  更多評(píng)論
            

          # re: 對(duì)google個(gè)性主頁的拖拽效果的js的完整注釋[未登錄] 2007-12-10 16:50 Tin
          @black visitor
          javascript的東西,如果支持IE6和firefox那么一般就會(huì)支持IE7。IE7在JS上面并沒有什么大的改進(jìn)……所以一般還是考慮最低版本的瀏覽器。  回復(fù)  更多評(píng)論
            

          # re: 對(duì)google個(gè)性主頁的拖拽效果的js的完整注釋 2008-02-15 10:26 zero8500
          正在學(xué)習(xí)這方面的東西。學(xué)習(xí)了。。。  回復(fù)  更多評(píng)論
            

          # re: 對(duì)google個(gè)性主頁的拖拽效果的js的完整注釋[未登錄] 2008-03-17 15:29
          我做了一個(gè)類似的個(gè)人首頁可拖動(dòng)的,有要的 email我,iamyangwenda@gmail.com
            回復(fù)  更多評(píng)論
            

          # re: 對(duì)google個(gè)性主頁的拖拽效果的js的完整注釋 2008-03-18 20:53 小朱
          @楊
          ???大哥,能發(fā)一份給我嗎?
          zhuyongke1@163.com  回復(fù)  更多評(píng)論
            

          # re: 對(duì)google個(gè)性主頁的拖拽效果的js的完整注釋[未登錄] 2008-04-18 15:08 tony
          演示地址http://my.enet.com.cn/myinfo.php,有交流的加我qq:477894  回復(fù)  更多評(píng)論
            

          # re: 對(duì)google個(gè)性主頁的拖拽效果的js的完整注釋 2008-05-24 12:58 楊文達(dá)
          有交流加我qq:30296521,或發(fā)郵件iamyangwenda@gmail.com  回復(fù)  更多評(píng)論
            

          # re: 對(duì)google個(gè)性主頁的拖拽效果的js的完整注釋 2008-05-24 12:59 楊文達(dá)
          @tony
          加這個(gè)qq:30296521  回復(fù)  更多評(píng)論
            

          # re: 對(duì)google個(gè)性主頁的拖拽效果的js的完整注釋 2008-10-08 13:26 123123123
          有沒有ASP版的?????????  回復(fù)  更多評(píng)論
            

          # re: 對(duì)google個(gè)性主頁的拖拽效果的js的完整注釋 2008-10-20 12:19 surffen
          哎 , 看了很多 ,還沒搞懂,  回復(fù)  更多評(píng)論
            

          # re: 對(duì)google個(gè)性主頁的拖拽效果的js的完整注釋 2008-12-09 10:56 ytwang
          請(qǐng)問摟主,我把它移植到asp.net中為什么會(huì)報(bào)腳本錯(cuò)誤"尚未實(shí)現(xiàn)",好像是js里的錯(cuò)誤  回復(fù)  更多評(píng)論
            

          # re: 對(duì)google個(gè)性主頁的拖拽效果的js的完整注釋[未登錄] 2009-06-09 16:05 zeus.xiao
          @楊
          兄弟,我想要一份,看到你的留言是在08年發(fā)的,不知道現(xiàn)在向你要是不是有點(diǎn)晚了.  回復(fù)  更多評(píng)論
            

          # re: 對(duì)google個(gè)性主頁的拖拽效果的js的完整注釋 2009-09-16 14:55 末_雪er
          @BlackSoul
          看不到你的例子,麻煩給我郵箱發(fā)份。用cookie保存用戶個(gè)性化的。
          582444403@qq.com
          謝謝了
            回復(fù)  更多評(píng)論
            

          # re: 對(duì)google個(gè)性主頁的拖拽效果的js的完整注釋 2009-10-31 18:12 jacksnow
          @BlackSoul
          看不到你的例子能不能麻煩給我發(fā)一份,可以么?謝謝
          jacksnow1026@163.com  回復(fù)  更多評(píng)論
            

          # re: 對(duì)google個(gè)性主頁的拖拽效果的js的完整注釋 2013-09-14 19:53 yaoth
          樓主很nb,謝謝!  回復(fù)  更多評(píng)論
            

          主站蜘蛛池模板: 冀州市| 齐齐哈尔市| 姜堰市| 淄博市| 前郭尔| 塔河县| 佛山市| 六安市| 岳普湖县| 曲松县| 绍兴市| 镇远县| 宁夏| 晋州市| 宜昌市| 金塔县| 柳林县| 黎川县| 永兴县| 治县。| 巴青县| 公安县| 项城市| 安溪县| 文化| 满城县| 河池市| 灌南县| 库尔勒市| 邹城市| 齐河县| 三原县| 和林格尔县| 竹北市| 洛阳市| 麟游县| 天全县| 兴化市| 三穗县| 施甸县| 弥勒县|