/** * @author ZhangHuihua@msn.com */ (function($){ var _op = { cursor: 'move', // selector 的鼠标手势 sortBoxs: 'div.sortDrag', //拖动排序项父容器 replace: false, //2个sortBox之间拖动替换 items: '> *', //拖动排序项选择器 selector: '', //拖动排序项用于拖动的子元素的选择器,为空时等于item zIndex: 1000 }; var sortDrag = { start:function($sortBox, $item, event, op){ var $placeholder = this._createPlaceholder($item); var $helper = $item.clone(); var position = $item.position(); $helper.data('$sortBox', $sortBox).data('op', op).data('$item', $item).data('$placeholder', $placeholder); $helper.addClass('sortDragHelper').css({position:'absolute',top:position.top+$sortBox.scrollTop(),left:position.left,zIndex:op.zIndex,width:$item.width()+'px',height:$item.height()+'px'}).jDrag({ selector:op.selector, drag:this.drag, stop:this.stop, event:event }); $item.before($placeholder).before($helper).hide(); return false; }, drag:function(el, event){ var $helper = $(arguments[0]), $sortBox = $helper.data('$sortBox'), $placeholder = $helper.data('$placeholder'); var $items = $sortBox.find($helper.data('op')['items']).filter(':visible').filter(':not(.sortDragPlaceholder, .sortDragHelper)'); var helperPos = $helper.position(), firstPos = $items.eq(0).position(); var $overBox = sortDrag._getOverSortBox($helper, event); if ($overBox.length > 0 && $overBox[0] != $sortBox[0]){ //移动到其他容器 $placeholder.appendTo($overBox); $helper.data('$sortBox', $overBox); } else { for (var i=0; i<$items.length; i++) { var $this = $items.eq(i), position = $this.position(); if (helperPos.top > position.top + 10) { $this.after($placeholder); } else if (helperPos.top <= position.top) { $this.before($placeholder); break; } } } }, stop:function(){ var $helper = $(arguments[0]), $sortBox = $helper.data('$sortBox'), $item = $helper.data('$item'), $placeholder = $helper.data('$placeholder'); var position = $placeholder.position(); $helper.animate({ top: (position.top+$sortBox.scrollTop()) + "px", left: position.left + "px" }, { complete: function(){ if ($helper.data('op')['replace']){ //2个sortBox之间替换处理 $srcBox = $item.parents(_op.sortBoxs+":first"); $destBox = $placeholder.parents(_op.sortBoxs+":first"); if ($srcBox[0] != $destBox[0]) { //判断是否移动到其他容器中 $replaceItem = $placeholder.next(); if ($replaceItem.size() > 0) { $replaceItem.insertAfter($item); } } } $item.insertAfter($placeholder).show(); $placeholder.remove(); $helper.remove(); }, duration: 300 }); }, _createPlaceholder:function($item){ return $('<'+$item[0].nodeName+' class="sortDragPlaceholder"/>').css({ width:$item.outerWidth()+'px', height:$item.outerHeight()+'px', marginTop:$item.css('marginTop'), marginRight:$item.css('marginRight'), marginBottom:$item.css('marginBottom'), marginLeft:$item.css('marginLeft') }); }, _getOverSortBox:function($item, e){ var itemPos = $item.position(); var y = itemPos.top+($item.height()/2), x = itemPos.left+($item.width()/2); return $(_op.sortBoxs).filter(':visible').filter(function(){ var $sortBox = $(this), sortBoxPos = $sortBox.position(), sortBoxH = $sortBox.height(), sortBoxW = $sortBox.width(); return DWZ.isOver(y, x, sortBoxPos.top, sortBoxPos.left, sortBoxH, sortBoxW); }); } }; $.fn.sortDrag = function(options){ return this.each(function(){ var op = $.extend({}, _op, options); var $sortBox = $(this); if ($sortBox.attr('selector')) op.selector = $sortBox.attr('selector'); $sortBox.find(op.items).each(function(i){ var $item = $(this), $selector = $item; if (op.selector) { $selector = $item.find(op.selector).css({cursor:op.cursor}); } $selector.mousedown(function(event){ sortDrag.start($sortBox, $item, event, op); event.preventDefault(); }); }); }); } })(jQuery);