对google个性主页的拖拽效果的js的完整注释-4

// 可拖拽Element的原形,用来将event绑定到各个钩子,这部分市比较通用的,netvibes也是基本完全相同的实现
// 这部分推荐看dindin的这个,也会帮助理解,http://www.jroller.com/page/dindin/?anchor=pro_java_12
var  Drag  =  {
     // 对这个element的引用,一次只能拖拽一个Element
    obj: null ,
     // element是被拖拽的对象的引用,elementHeader就是鼠标可以拖拽的区域
    init:   (elementHeader, element) {
         // 将start绑定到down事件,按下鼠标触发start
        elementHeader.down  =  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 " ;
        }
         // 挂上空,初始化这几个成员,在Drag.init被调用后才帮定到实际的函数,可以参照draggable里面的内容
        element.onDragStart  =   new  ();
        element.onDragEnd  =   new  ();
        element.onDrag  =   new  ();
    },
     // 开始拖拽的绑定,绑定到鼠标的移动的event上
    start:   (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上面来
        up  =  Drag.end;
        move  =  Drag.drag;
         return   false ;
    },
     // Element正在被拖动的函数
    drag:   (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:   (event) {
         // 解决不同浏览器的event模型不同的问题
        event  =  Drag.fixE(event);
         // 解除对Global的event的绑定
        move  =   null ;
        up  =   null ;
         // 先记录下onDragEnd的钩子,好移除obj
         var  _onDragEndFuc  =  Drag.obj.onDragEnd();
         // 拖拽完毕,obj清空
        Drag.obj  =   null ;
         return  _onDragEndFuc;
    },
     // 解决不同浏览器的event模型不同的问题
    fixE:   (ig_) {
         if  ( typeof  ig_  ==   " undefined " ) {
            ig_  =  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  =     (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"
// 挂载到,载入完毕执行。不过实际上google没有用。
// 而是写在页面最下面,异曲同工吧,也许直接写在页面是种怪癖,或者也有可能是兼容性考虑。

// 请将下面两条被注释掉的代码加,到你自己下载的一个google ig页面里面,把里面的所有其余删除,挂上这个js也可以拖拽了,哈哈
// _table=getElementById("t_1");
// = _IG_initDrag(_table);

// 其实看懂这些代码对学习java很有益,希望对大家能有帮助

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值