YUI 研究 -- DragDrop 模块

来源:互联网 发布:数据分析部门架构 编辑:程序博客网 时间:2024/05/17 08:49
例子
基础拖动
拖动柄
当前拖动元素置顶
代理拖动
自定义布局
组交互模式与盒子交互案例
固定区域内的拖动
圆形的拖动触发区域

YAHOO.util.DragDropMgr提供创建拖拽应用的框架

startX,startY
用于计算拖动的距离是否满足触发startDrop事件的条件。

deltaX,deltaY
记录mousedown事件相对于linked元素的位移,用于实现令拖动元素相对于鼠标静止移动的效果

dragOvers
通过此集合内容的变化能判断出当前DD对象与其它DD对象的交互情况(dragEnter、dragOver和dragOut

fireEvents(e, isDrop)触发拖拽模块中的场景事件
它主要是通过判断当前DD对象和其它DD对象位置上的关系来触发当前DD对象的dragEnter、dragOver、dragOut、dragDrop和invalidDrop等事件;
在handleMouseMove和handleMouseUp方法中分别被调用。被
handleMouseUp方法调用时isDrop为真,此时当前DD只会触发dragDrop而不是dragEnter或dragOver。当isDrop为假时反之。dragOut在两种情况下都有可能触发。
每次document上的mousemove和mouseup事件触发时都可能被调用,要注意其对性能的影响。

isOverTarget(pt, oTarget, intersect, curRegion)判断oTarget当前是否被覆盖了
缓存oTarget的linked元素的Region,useCache控制是否每次都重新计算一次Region;
如果当前拖动对象为空,或者交互模式是点模式而且没有任何区域限制,则返回pt是否在oTarget上;
否则,返回当前拖动元素在constraint和tick影响下的Region是否与oTarget有交集。


startDrag(x, y)触发startDrag事件的方法
触发
当前DD对象的b4StartDrag和startDrag事件。

stopDrag(e, silent)触发endDrag事件的方法
触发b4EndDrag、endDrag和mouseUp事件;
清空“当前拖动对象”和“当前覆盖对象列表”两个状态。

handleMouseDown(e, oDD)
计算deltaX和deltaY的值;
创建一个timer,在一段时间后触发dragStart事件,这个时间默认是一秒。这个timer可能会在其它事件触发时被清除。

handleMouseMove(e)在document范围中监听mousemove事件
当拖动时鼠标超出window边界时,调用handleMouseUp。在IE中当这种情况发生时,mousemove事件中的按键状态会从按下变成放开;但在其它浏览器中暂没方法检测这种情况;
利用startX和startY判断当前拖动的距离是否满足触发startDrag的条件;
触发当前DD对象的b4Drag、drag事件并调用fireEvents。

handleMouseUp(e)在document范围中监听mouseup事件
不明白为什么如果startDrag事件通过handleMouseDown中创建的timer触发时,要先调用一次handleMouseMove。注释说是为了得到dragOver事件,但为什么要得到这个事件呢?
调用fireEvents方法;
触发endDrag事件。

getBes**tch(dds)在dds中找到一个最适合的dd
首先看哪个DD是在光标下的;
如果没有DD在光标下的,则看那个DD与当前拖动DD
的相交面积最大。

refreshCache(groups)刷新DD对象linked元素位置的缓存
如果groups为空,则刷新所有DD对象的缓存。

handleWasClicked(node, id)判断node是否为id所指DD对象的拖动柄
在node和它的所有父节元素上用isHandle方法测试。

getLocation(oDD)返回oDD的linked元素的Region

verify(el)检测el是否在DOM中

lock()锁定
unlock()解锁
isLocked()判断锁

regDragDrop(oDD, sGroup)注册DD对象
在DragDrop.init中被调用。

removeDDFromGroup(oDD, sGroup)注销DD对象
在DragDrop.removeFromGroup中被调用,文档建议不要直接调用。

unregAll()调用所有DD对象的unreg方法

regHandle(sDDId, sHandleId)注册DD的拖动柄
在DragDrop.setHandleElId中被调用。

isDragDrop(id)判断是否是已注册的DD对象

getRelated(p_oDD, bTargetsOnly)获取相关的DD对象

isLegalTarget(oDD, oTargetDD)判断oTargetDD是否为oDD的合法目标

isTypeOfDD(oDD)判断oDD是否为DD对象
内部保存了一个__ygDragDrop属性作为DD对象的标示。

ishandle(sDDId, sHandleId)判断拖动柄

getDDById(id)根据id获取DD对象

stopEvent(e)阻止事件传播和默认事件
主要是根据stopPropagation和preventEvent两个布尔属性判断是否进行相应处理。

swapNode(n1, n2)交换两个元素的位置

_addListeners()使此模块可以在Event之前加载而不出错
如果Event和document都已经加载了,调用_onLoad;
否则,它会每10毫秒尝试调用自身一次,如果document加载完成后再尝试2000次都没有检测到Event则放弃。

_onLoad()
调用init;
分别在document的mouseup、mousemove和window的unload、resize上注册相应方法。


_onResize()调用所有DD对象的resetConstraints方法

_remove(oDD)注销DD对象
在DragDrop.unreg中被调用,文档建议不要直接调用。

_onUnload()unload事件处理方法,调用unregAll

YAHOO.util.DragDrop为拖拽提供基本操作和接口
linked元素:定义与其他DD对象交互的边界;
handle元素:拖动柄;
drag元素:跟随光标移动的元素;
b4为前缀的函数主要用于写基类;
它通过augment继承了EventProvider的功能。

on与subscribe等价

DragDrop(id, sGroup, config)构造函数
调用init。

getEl()返回linked元素

getDragEl()返回drag元素

init(id, sGroup, config)
调用initTarget;
把handleMouseDown注册到id的mousedown事件;
创建config.events中声明的事件对象。


getTargetCoord(iPageX, iPageY)
计算拖动元素的正确位置
用deltaX和deltaY计算保持鼠标相对于拖动元素静止的坐标;
用constraint和tick修正坐标。


initTarget(id, sGroup, config)初始化
把handleOnAvailable注册在id的available事件中;
在不能触发startDrag的元素类型列表中加入A;
调用applyConfig。


applyConfig()根据构造方法的配置参数设置初始化对象状态

handleOnAvailable()available事件的处理器
调用resetConstraints和onAvailable。

setPadding(iTop, iRight, iBot, iLeft)设置内边距

setInitPosition(diffX, diffY)保存linked元素的初始位置
把现在的坐标减去diff得到初始坐标;
调用
setStartPosition


setStartPosition(pos)设置起始位置
把现在的坐标减去diff得到初始坐标;
调用
setStartPosition


addToGroup(sGroup)加入组

removeFromGroup(sGroup)退出组
清除对象自身的状态和DDM的状态。

setDragElId(id)设置drag元素

setHandleElId(id)设置在linked元素中的拖动柄
如果id是一个dom元素且没有id属性,则为之生成;
在DDM中注册此拖动柄。

setOuterHandleElId(id)设置在linked元素外的拖动柄
如果id是一个dom元素且没有id属性,则为之生成;
在id的mousedown事件上注册handleMouseDown;
在DDM中注册此拖动柄。

unreg()注销此DD对象
注销此DD对象linked元素的mousedown事件;
在DDM中注销此对象。


isLock()判断锁
先检测DDM中的lock再检测自身。

handleMouseDown(e, oDD)linked元素的mousedown事件的处理方法
根据primaryButtonOnly判断鼠标的按键类型是否正确;
判断锁状态;
触发b4MouseDown和mouseDown事件,如果其中有一个返回false,则此方法立刻返回;
刷新DDM中与此DD对象同组的DD对象的位置信息缓存;
如果是合法的点击,保存此时的DD位置作为startDrag的起始位置并调用DDM的handleMouseDown。

clickValidator(e)判断点击是否合法
根据非法点击元素列表和DDM的wasValidClicked判断合法性。

getTargetCoord(iPageX, iPageY)返回修正坐标
通过delta、constraint和tick等修正的坐标。

addInvalidHandleType(tagName)
addInvalidHandleId(id)
addInvalidHandleClass(cssClass)
removeInvalidHandleType(tagName)
removeInvalidHandleId(id)
removeInvalidHandleClass(cssClass)增减不合法拖动柄列表信息
isValidHandleChild(node)检测node是否是合法的拖动柄

setXTicks(iStartX, iTickSize)计算水平间隔点数组
setYTicks(iStartY, iTickSize)计算垂直间隔点数组
clearTicks()清除间隔
两个方法的第一个参数在方法实现中并未使用,调用时可用null填补;
根据initPage、max、min,iTickSize计算出在水平垂直两个方向上drag元素所能到达点的数组。


setXConstraint(iLeft, iRight, iTickSize)设置水平方向约束
setYConstraint(iUp, iDown, iTickSize)设置垂直方向约束
clearConstraints()清除约束
使用initPageX和initPageY计算边界值。

resetConstraints()重置约束
当手工改动过DD元素的位置时,使用initPage和lastPage计算历史的偏移值,是当前linked元素的位置为lastPage,再使用lastPage减去偏移值得到新的initPage,从而保持元素的位移状态;
重新计算constraint。


getTick(val, tickArray)在tickArray中选择离val最近的点

toString()打印id

YAHOO.util.DDTarget只作为DD目标
继承DragDrop,只覆盖了toString方法。

YAHOO.util.DDlinked元素随着光标移动的DragDrop实现

scroll
如果为真,当元素拖动的窗口边界时会自动滚屏。

atuoOffset(iPageX, iPageY)
setDelta(iDeltaX, iDeltaY)设置delta值

setDragElPos(iPageX, iPageY)
alignElWithMouse(e,iPageX, iPageY)根据光标位置定位drag元素
调用一次setXY,然后缓存了此元素在left和top为零时的基准坐标。下次调整坐标时,可以用iPage减去此基准坐标就能得出用于调整left和top的新值;
调用cachePosition和autoScroll。

cachePosition(iPageX, iPageY)更新lastPage

autoScroll(x, y, h, w)当drag元素被拖动到超出窗口边界的位置时自动滚屏
利用拖动元素的边超越窗口的可视边界时,判断光标离边界的距离是否小于阀值,如果是则滚动窗口一个预定的距离(IE为80,其他为30);
此函数在向上滚和向左滚的实现上故意不考虑光标问题,使得在边界情况下也能表现正常。

applyConfig()调用父类构造函数和设置scroll

b4MouseDown()记录start和delta值

b4Drag()调用setDragElPos移动元素

toString()打印id

YAHOO.util.DDProxy新创建的元素随着光标移动的DragDrop实现

resizeFrame
新创建的代理是否与linked元素的形状一样。

centerFrame
新创建代理的中心是否与光标对齐。

DDProxy(id, sGroup, config)构造函数
调用init和initFrame。

createFrame()创建代理
判断body和body.firstChild是否已经准备好,如果没有准备好,则延迟50毫秒在执行自己一次;
在IE中新创建的代理有可能被select戳穿,所以在里面加个透明的iframe;
它还在里面加了个有背景颜色的fake层,不过具体用意没看明白它的注释。

initFrame()调用createFrame

applyConfig()调用父类构造函数和设置resizeFrame、centerFrame和dragElId

showFrame(iPageX, iPageY)调整代理的大小和位置并显示它

_resizeProxy()调用代理大小
长宽加边框等于linked元素的大小。

b4MouseDown()记录start和delta值
不知道为啥要覆盖DD的,两个方法好像一样。

b4StartDrag()调用showFrame

b4EndDrag()隐藏代理

endDrag()把linked元素移动到drag元素的位置上

toString()打印id
 
原创粉丝点击