tijian_tieying/web/dccdc/ligerUI/js/plugins/ligerDrag.js
2025-02-20 12:14:39 +08:00

354 lines
11 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
* jQuery ligerUI 1.3.2
*
* http://ligerui.com
*
* Author daomi 2015 [ gd_star@163.com ]
*
*/
(function ($)
{
var l = $.ligerui;
$.fn.ligerDrag = function (options)
{
return l.run.call(this, "ligerDrag", arguments,
{
idAttrName: 'ligeruidragid', hasElement: false, propertyToElemnt: 'target'
}
);
};
$.fn.ligerGetDragManager = function ()
{
return l.run.call(this, "ligerGetDragManager", arguments,
{
idAttrName: 'ligeruidragid', hasElement: false, propertyToElemnt: 'target'
});
};
$.ligerDefaults.Drag = {
onStartDrag: false,
onDrag: false,
onStopDrag: false,
handler: null,
//鼠标按下再弹起,如果中间的间隔小于[dragDelay]毫秒,那么认为是点击,不会进行拖拽操作
clickDelay : 100,
//代理 拖动时的主体,可以是'clone'或者是函数,放回jQuery 对象
proxy: true,
revert: false,
animate: true,
onRevert: null,
onEndRevert: null,
//接收区域 jQuery对象或者jQuery选择字符
receive: null,
//进入区域
onDragEnter: null,
//在区域移动
onDragOver: null,
//离开区域
onDragLeave: null,
//在区域释放
onDrop: null,
disabled: false,
proxyX: null, //代理相对鼠标指针的位置,如果不设置则对应target的left
proxyY: null
};
l.controls.Drag = function (options)
{
l.controls.Drag.base.constructor.call(this, null, options);
};
l.controls.Drag.ligerExtend(l.core.UIComponent, {
__getType: function ()
{
return 'Drag';
},
__idPrev: function ()
{
return 'Drag';
},
_render: function ()
{
var g = this, p = this.options;
this.set(p);
g.cursor = "move";
g.handler.css('cursor', g.cursor);
g.mouseDowned = false;
g.handler.bind('mousedown.drag', function (e)
{
if (p.disabled) return;
if (e.button == 2) return;
g.mouseDowned = true;
$(document).bind("selectstart.drag", function () { return false; });
setTimeout(function ()
{
//如果过了N毫秒,鼠标还没有弹起来才认为是启动drag
if (g.mouseDowned)
{
g._start.call(g, e);
}
}, p.clickDelay || 100);
}).bind('mousemove.drag', function ()
{
if (p.disabled) return;
g.handler.css('cursor', g.cursor);
}).bind('mouseup.drag', function ()
{
$(document).unbind("selectstart.drag");
});
$(document).bind('mouseup', function ()
{
g.mouseDowned = false;
});
},
_rendered: function ()
{
this.options.target.ligeruidragid = this.id;
},
_start: function (e)
{
var g = this, p = this.options;
if (g.reverting) return;
if (p.disabled) return;
g.current = {
target: g.target,
left: g.target.offset().left,
top: g.target.offset().top,
startX: e.pageX || e.screenX,
startY: e.pageY || e.clientY
};
if (g.trigger('startDrag', [g.current, e]) == false) return false;
g.cursor = "move";
g._createProxy(p.proxy, e);
//代理没有创建成功
if (p.proxy && !g.proxy) return false;
(g.proxy || g.handler).css('cursor', g.cursor);
$(document).bind('mousemove.drag', function ()
{
g._drag.apply(g, arguments);
});
l.draggable.dragging = true;
$(document).bind('mouseup.drag', function ()
{
l.draggable.dragging = false;
g._stop.apply(g, arguments);
});
},
_drag: function (e)
{
var g = this, p = this.options;
if (!g.current) return;
var pageX = e.pageX || e.screenX;
var pageY = e.pageY || e.screenY;
g.current.diffX = pageX - g.current.startX;
g.current.diffY = pageY - g.current.startY;
(g.proxy || g.handler).css('cursor', g.cursor);
if (g.receive)
{
g.receive.each(function (i, obj)
{
var receive = $(obj);
var xy = receive.offset();
if (pageX > xy.left && pageX < xy.left + receive.width()
&& pageY > xy.top && pageY < xy.top + receive.height())
{
if (!g.receiveEntered[i])
{
g.receiveEntered[i] = true;
g.trigger('dragEnter', [obj, g.proxy || g.target, e]);
}
else
{
g.trigger('dragOver', [obj, g.proxy || g.target, e]);
}
}
else if (g.receiveEntered[i])
{
g.receiveEntered[i] = false;
g.trigger('dragLeave', [obj, g.proxy || g.target, e]);
}
});
}
if (g.hasBind('drag'))
{
if (g.trigger('drag', [g.current, e]) != false)
{
g._applyDrag();
}
else
{
if (g.proxy)
{
g._removeProxy();
} else
{
g._stop();
}
}
}
else
{
g._applyDrag();
}
},
_stop: function (e)
{
var g = this, p = this.options;
$(document).unbind('mousemove.drag');
$(document).unbind('mouseup.drag');
$(document).unbind("selectstart.drag");
if (g.receive)
{
g.receive.each(function (i, obj)
{
if (g.receiveEntered[i])
{
g.trigger('drop', [obj, g.proxy || g.target, e]);
}
});
}
if (g.proxy)
{
if (p.revert)
{
if (g.hasBind('revert'))
{
if (g.trigger('revert', [g.current, e]) != false)
g._revert(e);
else
g._removeProxy();
}
else
{
g._revert(e);
}
}
else
{
g._applyDrag(g.target);
g._removeProxy();
}
}
g.cursor = 'move';
g.trigger('stopDrag', [g.current, e]);
g.current = null;
g.handler.css('cursor', g.cursor);
},
_revert: function (e)
{
var g = this;
g.reverting = true;
g.proxy.animate({
left: g.current.left,
top: g.current.top
}, function ()
{
g.reverting = false;
g._removeProxy();
g.trigger('endRevert', [g.current, e]);
g.current = null;
});
},
_applyDrag: function (applyResultBody)
{
var g = this, p = this.options;
applyResultBody = applyResultBody || g.proxy || g.target;
var cur = {}, changed = false;
var noproxy = applyResultBody == g.target;
if (g.current.diffX)
{
if (noproxy || p.proxyX == null)
cur.left = g.current.left + g.current.diffX;
else
cur.left = g.current.startX + p.proxyX + g.current.diffX;
changed = true;
}
if (g.current.diffY)
{
if (noproxy || p.proxyY == null)
cur.top = g.current.top + g.current.diffY;
else
cur.top = g.current.startY + p.proxyY + g.current.diffY;
changed = true;
}
if (applyResultBody == g.target && g.proxy && p.animate)
{
g.reverting = true;
applyResultBody.animate(cur, function ()
{
g.reverting = false;
});
}
else
{
applyResultBody.css(cur);
}
},
_setReceive: function (receive)
{
this.receiveEntered = {};
if (!receive) return;
if (typeof receive == 'string')
this.receive = $(receive);
else
this.receive = receive;
},
_setHandler: function (handler)
{
var g = this, p = this.options;
if (!handler)
g.handler = $(p.target);
else
g.handler = (typeof handler == 'string' ? $(handler, p.target) : handler);
},
_setTarget: function (target)
{
this.target = $(target);
},
_setCursor: function (cursor)
{
this.cursor = cursor;
(this.proxy || this.handler).css('cursor', cursor);
},
_createProxy: function (proxy, e)
{
if (!proxy) return;
var g = this, p = this.options;
if (typeof proxy == 'function')
{
g.proxy = proxy.call(this.options.target, g, e);
}
else if (proxy == 'clone')
{
g.proxy = g.target.clone().css('position', 'absolute');
g.proxy.appendTo('body');
}
else
{
g.proxy = $("<div class='l-draggable'></div>");
g.proxy.width(g.target.width()).height(g.target.height())
g.proxy.attr("dragid", g.id).appendTo('body');
}
g.proxy.css({
left: p.proxyX == null ? g.current.left : g.current.startX + p.proxyX,
top: p.proxyY == null ? g.current.top : g.current.startY + p.proxyY
}).show();
},
_removeProxy: function ()
{
var g = this;
if (g.proxy)
{
g.proxy.remove();
g.proxy = null;
}
}
});
})(jQuery);