问题说明:
Firefox下以图片为句柄的拖拽效果无法触发onmouseup事件
解决方法 :
Firefox下Drag效果句柄不能作用在img元素上,解决有两种。
1、 用一个div层盖住img
2、 用非img元素作拖拽句柄
涉及概念总结:
1、handle.onmousedown: 触发拖拽时间,并在事件中绑定move和up事件
2、document.onmousemove: 鼠标移动事件,持续响应拖拽
3、document.onmouseup: 拖拽结束即鼠标up事件,负责挂拖拽结束后的事件回调函数。
4、因为拖拽的范围是整个浏览器所以move和up事件应该作用到document上。
5、这里有联系事件捕捉概念,setCapture函数的作用就是将后续的mouse事件都发送给这个对象,releaseCapture就是将鼠标事件还回去。特别说明一下,在windows32位系统中,move事件是每个一个时间段检测一次鼠标位置,而非每次拖拽,所以如果不加setCapture函数很容易失去拖拽焦点,而且这并不保证一定出现,测试难度很大。
6、clientX,clientY事件触发的坐标,这里持续跟踪鼠标拖拽。
7、设置偏移量: 事件触发到句柄元素上,但往往不是句柄的0,0坐标,这是就引入偏移量问题,通过如下表达式计算出偏移量。
evt.clientX-handle.offsetLeft;
evt.clientY-handle.offsetTop;
8、计算拖拽句柄的left和top,通过事件坐标减去偏移量就可以得到最终的拖拽方位了。
handle.style.left=e.clientX-fx;
handle.style.top=e.clientY-fy;
9、在整个过程中你还应考虑事件冒泡和浏览器时间兼容
getEvt:function(evt){
return evt||window.event;
},
stopEvt:function(evt){
Browser.isIE?(evt.cancelBubble=true):evt.stopPropagation();
}
并附上一个拖拽库,功能和效果不如dom-drag但是只有0.8k轻巧一些,30多行代码。