// 可拖拽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很有益,希望对大家能有帮助