<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Tin's Blog

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

      BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
      128 隨筆 :: 0 文章 :: 221 評論 :: 0 Trackbacks
    這兩天太忙了,沒時間寫Blog,業余時間又扒了一次google的拖拽,對比了netvibes的,差不多,讓后就寫了個注釋,順便學習。
    google用了混淆,js里面的命名比較暈。我花了些時間把他們翻譯成容易看懂的命名,并且作了注釋,希望對大家有幫助。
    可以這里下載我的例子:
    http://www.tkk7.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 ;
    // 獲取一個element的offset信息,其實就是相對于Body的padding以內的絕對坐標
    //
    后面一個參數如果是true則獲取offsetLeft,false則是offsetTop
    //
    關于offset、style、client等坐標的定義參考dindin的這個帖子: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;
    };
    // 將一個function(參數中的funcName是這個fuction的名字)綁定到一個element上,并且以這個element的上下文運行,其實是一種繼承,這個可以google些文章看看
    Util.bindFunction? = ? function ?(el,?fucName)?{
    ????
    return ? function ?()?{
    ????????
    return ?el[fucName].apply(el,?arguments);
    ????};
    };
    // 重新計算所有的可以拖拽的element的坐標,對同一個column下面的可拖拽圖層重新計算它們的高度而得出新的坐標,防止遮疊
    //
    計算出來的坐標記錄在pagePosLeft和pagePosTop兩個屬性里面
    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中間那個table,也就是拖拽的容器,配合show一般就是刷新用,解決一些瀏覽器的怪癖
    Util.hide? = ? function ?()?{
    ????Util.rootElement.style.display?
    = ? " none " ;
    };
    // 顯示Google?Ig中間那個table,解釋同上
    Util.show? = ? function ?()?{
    ????Util.rootElement.style.display?
    = ? "" ;
    };

    // 移動時顯示的占位虛線框
    ghostElement? = ? null ;
    // 獲取這個虛線框,通過dom動態生成
    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的函數,與拖拽無關的我去掉了
    function ?draggable(el)?{
    ????
    // 公用的開始拖拽的函數
    ???? this ._dragStart? = ?start_Drag;
    ????
    // 公用的正在拖拽的函數
    ???? this ._drag? = ?when_Drag;
    ????
    // 公用的拖拽結束的函數
    ???? this ._dragEnd? = ?end_Drag;
    ????
    // 這個函數主要用來進行拖拽結束后的dom處理
    ???? this ._afterDrag? = ?after_Drag;
    ????
    // 是否正在被拖動,一開始當然沒有被拖動
    ???? this .isDragging? = ? false ;
    ????
    // 將這個Element的this指針注冊在elm這個變量里面,方便在自己的上下文以外調用自己的函數等,很常用的方法
    ???? this .elm? = ?el;
    ????
    // 觸發拖拽的Element,在這里就是這個div上顯示標題的那個div
    ???? this .header? = ?document.getElementById(el.id? + ? " _h " );
    ????
    // 對于有iframe的element拖拽不同,這里檢測一下并記錄
    ???? this .hasIFrame? = ? this .elm.getElementsByTagName( " IFRAME " ).length? > ? 0 ;
    ????
    // 如果找到了header就綁定drag相關的event
    ???? if ?( this .header)?{
    ????????
    // 拖拽時的叉子鼠標指針
    ???????? this .header.style.cursor? = ? " move " ;
    ????????
    // 將函數綁定到header和element的this上,參照那個函數的說明
    ????????Drag.init( this .header,? this .elm);
    ????????
    // 下面三個語句將寫好的三個函數綁定給這個elemnt的三個函數鉤子上,也就實現了element從draggable繼承可拖拽的函數
    ???????? this .elm.onDragStart? = ?Util.bindFunction( this ,? " _dragStart " );
    ????????
    this .elm.onDrag? = ?Util.bindFunction( this ,? " _drag " );
    ????????
    this .elm.onDragEnd? = ?Util.bindFunction( this ,? " _dragEnd " );
    ????}
    };

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



    // 下面是初始化的函數了,看看上面這些東西怎么被調用
    var ?_IG_initDrag? = ? function ?(el)?{
    ????
    // column那個容器,在google里面就是那個table布局的tbody,netvibes用的<div>
    ????Util.rootElement? = ?el;
    ????
    // 這個tbody的行
    ????Util._rows? = ?Util.rootElement.tBodies[ 0 ].rows[ 0 ];
    ????
    // 列,google是3列,其實也可以更多
    ????Util.column? = ?Util._rows.cells;
    ????
    // 用來存取可拖拽的對象
    ????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就把它初始化為一個draggable對象
    ???????????? if ?(ele1.tagName? == ? " DIV " )?{
    ????????????????Util.dragArray[counter]?
    = ? new ?draggable(ele1);
    ????????????????counter
    ++ ;
    ????????????}
    ????????}
    ????}
    };

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

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

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

    評論

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

    # re: 對google個性主頁的拖拽效果的js的完整注釋 2006-05-23 16:24 sillyman
    每個用戶登陸進去看到的都是個性化的界面,這種界面的位置信息我想是應該保存在服務器上的,可是怎樣保存的呢,保存在數據庫里嗎?數據庫的表結構又應該是怎樣的呢?  回復  更多評論
      

    # re: 對google個性主頁的拖拽效果的js的完整注釋 2006-05-24 10:17 Tin
    關于數據保存的問題,其實并不難,因為每次拖拽結束都回得出該div在哪個拖拽區域div里面,順序也可以通過遍歷所在div的childNodes來找到,然后調用一個XmlHttpRequest回去保存就可以了。在數據庫里面保存應該只保存位置,然后給每個位置一個id,這個id在對應一個應用(即div里面顯示的內容)就可以了。可以參考netvibes,它就是一個id對應一個rss,div里面顯示rss的內容就可以了。XmlHttpRequest只需看看Ajax的相關書籍就可以了。推薦Ajax修煉之道和Ajax實戰兩本書。  回復  更多評論
      

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

    # re: 對google個性主頁的拖拽效果的js的完整注釋 2006-05-24 14:54 sillyman
    在網上轉了兩天了,也沒找大相應的代碼,郁悶死了!  回復  更多評論
      

    # re: 對google個性主頁的拖拽效果的js的完整注釋 2006-05-24 15:03 sillyman
    我想可以保存在數據庫里,表結構可以這樣定義(用戶ID,行號,列號,應用ID),如果數據能存成這樣,我想就好做了,可是保存的時候怎樣得到“行號、列號、和應用號”呢?樓主能否幫寫點代碼!  回復  更多評論
      

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

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

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

    附件中注釋是亂碼!  回復  更多評論
      

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

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

    aspx寫的仿google主頁.用戶信息用xml保存,客戶端寫cookie,cookie使用的是客戶ip地址.
    xml設置比較簡單 1.id,2.所屬框架位置,3.rss地址..  回復  更多評論
      

    # re: 對google個性主頁的拖拽效果的js的完整注釋 2006-10-27 15:50 mmmtoo
    怎么實現的本地cookie保存啊?  回復  更多評論
      

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

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

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

    # re: 對google個性主頁的拖拽效果的js的完整注釋 2006-11-07 15:58 11
    cookie保存還是沒有搞定啊,樓主是高手,幫忙解決一下啊!學習~  回復  更多評論
      

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

    謝謝。  回復  更多評論
      

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

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

    # re: 對google個性主頁的拖拽效果的js的完整注釋[未登錄] 2007-12-10 16:48 Tin
    那個其實很簡單,因為更新是分塊的。分塊更新就不會破壞布局。
    比如你的布局后的小容器是div,如果你只更新div的innerHTML,那么布局就不會變。
    我這個注釋非常古老了,大家如果看DragDrop的代碼可以去看Script.aculo.us或者JQuery或者moo.fx里面的實現,估計更有收獲。  回復  更多評論
      

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

    # re: 對google個性主頁的拖拽效果的js的完整注釋 2008-02-15 10:26 zero8500
    正在學習這方面的東西。學習了。。。  回復  更多評論
      

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

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

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

    # re: 對google個性主頁的拖拽效果的js的完整注釋 2008-05-24 12:58 楊文達
    有交流加我qq:30296521,或發郵件iamyangwenda@gmail.com  回復  更多評論
      

    # re: 對google個性主頁的拖拽效果的js的完整注釋 2008-05-24 12:59 楊文達
    @tony
    加這個qq:30296521  回復  更多評論
      

    # re: 對google個性主頁的拖拽效果的js的完整注釋 2008-10-08 13:26 123123123
    有沒有ASP版的?????????  回復  更多評論
      

    # re: 對google個性主頁的拖拽效果的js的完整注釋 2008-10-20 12:19 surffen
    哎 , 看了很多 ,還沒搞懂,  回復  更多評論
      

    # re: 對google個性主頁的拖拽效果的js的完整注釋 2008-12-09 10:56 ytwang
    請問摟主,我把它移植到asp.net中為什么會報腳本錯誤"尚未實現",好像是js里的錯誤  回復  更多評論
      

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

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

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

    # re: 對google個性主頁的拖拽效果的js的完整注釋 2013-09-14 19:53 yaoth
    樓主很nb,謝謝!  回復  更多評論
      

    主站蜘蛛池模板: 亚洲xxxx18| 成全视频高清免费观看电视剧| 亚洲AV无码不卡在线观看下载| 国内精品免费在线观看| 亚洲综合久久一本伊伊区| 国产一级大片免费看| 久别的草原电视剧免费观看| 亚洲色一区二区三区四区 | 亚洲国产精品一区二区久久hs| 国产妇乱子伦视频免费| 在线观看免费亚洲| 亚洲色图国产精品| 免费一级国产生活片| 91精品国产免费久久国语蜜臀| 国产亚洲精品美女2020久久| 久久精品国产亚洲AV无码麻豆| 日本免费一区二区三区最新vr| a级黄色毛片免费播放视频| 亚洲国产精品嫩草影院| 亚洲视频在线播放| 亚洲不卡AV影片在线播放| www.免费在线观看| aa毛片免费全部播放完整| 亚洲欧美aⅴ在线资源| 中文字幕亚洲精品| 亚洲欧洲美洲无码精品VA| 国产免费拔擦拔擦8x| 免费影院未满十八勿进网站| 国色精品va在线观看免费视频| 亚洲精华国产精华精华液| 亚洲国语在线视频手机在线| 亚洲综合精品香蕉久久网| 毛片免费全部播放一级| 香港a毛片免费观看| 三级毛片在线免费观看| 特黄aa级毛片免费视频播放| 国产亚洲精品影视在线| 亚洲成人高清在线观看| 亚洲avav天堂av在线不卡| 亚洲午夜福利在线观看| 亚洲国产精品成人网址天堂|