/** * @author Roger Wu */ (function($){ $.fn.jDrag = function(options){ if (typeof options == 'string') { if (options == 'destroy') return this.each(function(){ $(this).unbind('mousedown', $.rwdrag.start); $.data(this, 'pp-rwdrag', null); }); } return this.each(function(){ var el = $(this); $.data($.rwdrag, 'pp-rwdrag', { options: $.extend({ el: el, obj: el }, options) }); if (options.event) $.rwdrag.start(options.event); else { var select = options.selector; $(select, obj).bind('mousedown', $.rwdrag.start); } }); }; $.rwdrag = { start: function(e){ document.onselectstart=function(e){return false};//禁止选择 var data = $.data(this, 'pp-rwdrag'); var el = data.options.el[0]; $.data(el, 'pp-rwdrag', { options: data.options }); if (!$.rwdrag.current) { $.rwdrag.current = { el: el, oleft: parseInt(el.style.left) || 0, otop: parseInt(el.style.top) || 0, ox: e.pageX || e.screenX, oy: e.pageY || e.screenY }; $(document).bind("mouseup", $.rwdrag.stop).bind("mousemove", $.rwdrag.drag); } }, drag: function(e){ if (!e) var e = window.event; var current = $.rwdrag.current; var data = $.data(current.el, 'pp-rwdrag'); var left = (current.oleft + (e.pageX || e.clientX) - current.ox); var top = (current.otop + (e.pageY || e.clientY) - current.oy); if (top < 1) top = 0; if (data.options.move == 'horizontal') { if ((data.options.minW && left >= $(data.options.obj).cssv("left") + data.options.minW) && (data.options.maxW && left <= $(data.options.obj).cssv("left") + data.options.maxW)) current.el.style.left = left + 'px'; else if (data.options.scop) { if (data.options.relObj) { if ((left - parseInt(data.options.relObj.style.left)) > data.options.cellMinW) { current.el.style.left = left + 'px'; } } else current.el.style.left = left + 'px'; } } else if (data.options.move == 'vertical') { current.el.style.top = top + 'px'; } else { var selector = data.options.selector ? $(data.options.selector, data.options.obj) : $(data.options.obj); if (left >= -selector.outerWidth() * 2 / 3 && top >= 0 && (left + selector.outerWidth() / 3 < $(window).width()) && (top + selector.outerHeight() < $(window).height())) { current.el.style.left = left + 'px'; current.el.style.top = top + 'px'; } } if (data.options.drag) { data.options.drag.apply(current.el, [current.el, e]); } return $.rwdrag.preventEvent(e); }, stop: function(e){ var current = $.rwdrag.current; var data = $.data(current.el, 'pp-rwdrag'); $(document).unbind('mousemove', $.rwdrag.drag).unbind('mouseup', $.rwdrag.stop); if (data.options.stop) { data.options.stop.apply(current.el, [current.el, e]); } $.rwdrag.current = null; document.onselectstart=function(e){return true};//启用选择 return $.rwdrag.preventEvent(e); }, preventEvent:function(e){ if (e.stopPropagation) e.stopPropagation(); if (e.preventDefault) e.preventDefault(); return false; } }; })(jQuery);