dwz.miscDrag.js 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287
  1. /**
  2. * @author 张慧华 z@j-ui.com
  3. */
  4. (function($){
  5. DWZ.miscDrag = {
  6. start:function($sortBox, $item, event, op){
  7. var $helper = $item.clone();
  8. var position = $item.position();
  9. $helper.addClass('sortDragHelper').css({
  10. position:'absolute',
  11. top:position.top+$sortBox.scrollTop(),
  12. left:position.left,
  13. zIndex:op.zIndex,
  14. minWidth:$item.width()+'px',
  15. height:$item.height()+'px'
  16. }).jDrag({
  17. drag:this.drag,
  18. stop:this.stop,
  19. event:event
  20. });
  21. $helper.data('$sortBox', $sortBox);
  22. $item.before($helper);
  23. return false;
  24. },
  25. drag:function(el, event){
  26. },
  27. stop:function(el, event){
  28. var $helper = $(arguments[0]),
  29. $sortBox = $helper.data('$sortBox'),
  30. $overBox = DWZ.miscDrag._getOverSortBox($sortBox.find($sortBox.attr('drag-rel')), $helper);
  31. if ($overBox.length > 0){ //移动到指定容器
  32. var $dragBox = $helper.appendTo($overBox).mousedown(function(event){
  33. $(this).jDrag({event:event});
  34. });
  35. var txt = $dragBox.html(),
  36. icon = $dragBox.attr('data-icon'),
  37. sn = $dragBox.attr('data-sn'),
  38. sequence = $overBox.find('> div').size();
  39. var overBoxPos = $overBox.position(),
  40. dragBoxPos = $dragBox.position();
  41. var content = icon ? '<img src="'+icon+'" />' : txt;
  42. $dragBox.attr('data-sequence', sequence).html(' <h2>' + sequence + '</h2>' + content).css({
  43. height: 'auto',
  44. top:(dragBoxPos.top - overBoxPos.top) + 'px',
  45. left:(dragBoxPos.left - overBoxPos.left) + 'px'
  46. });
  47. var rel = $sortBox.attr('rel');
  48. if (rel) {
  49. $('<div class="sortDrag" data-sn="'+sn+'"><h2>'+sequence+'</h2></div>').appendTo(rel);
  50. }
  51. } else {
  52. $helper.remove();
  53. }
  54. },
  55. _getOverSortBox:function($sortBox, $item){
  56. var itemPos = $item.position();
  57. var y = itemPos.top+($item.height()/2), x = itemPos.left+($item.width()/2);
  58. return $sortBox.filter(':visible').filter(function(){
  59. var $sortBox = $(this), sortBoxPos = $sortBox.offset(),
  60. sortBoxH = $sortBox.height(), sortBoxW = $sortBox.width();
  61. return DWZ.isOver(y, x, sortBoxPos.top, sortBoxPos.left, sortBoxH, sortBoxW);
  62. });
  63. },
  64. _createPlaceholder:function($item){
  65. return $('<'+$item[0].nodeName+' class="sortDragPlaceholder"/>').css({
  66. // width:$item.outerWidth()+'px',
  67. height:$item.outerHeight()+'px',
  68. marginTop:$item.css('marginTop'),
  69. marginRight:$item.css('marginRight'),
  70. marginBottom:$item.css('marginBottom'),
  71. marginLeft:$item.css('marginLeft')
  72. });
  73. },
  74. startSortDrag:function($sortBox, $item, event, op){
  75. var $placeholder = this._createPlaceholder($item);
  76. var $helper = $item.clone();
  77. var position = $item.position();
  78. $helper.data('$sortBox', $sortBox).data('op', op).data('$item', $item).data('$placeholder', $placeholder);
  79. $helper.addClass('sortDragHelper').css({
  80. position:'absolute',
  81. top:position.top+$sortBox.scrollTop(),
  82. left:position.left,
  83. zIndex:op.zIndex,
  84. width:$item.width()+'px',
  85. height:$item.height()+'px'
  86. }).jDrag({
  87. drag:this.dragSortDrag,
  88. stop:this.stopSortDrag,
  89. event:event
  90. });
  91. $item.before($helper).before($placeholder);
  92. return false;
  93. },
  94. dragSortDrag:function(el, event){
  95. var $helper = $(arguments[0]), $sortBox = $helper.data('$sortBox'),
  96. $placeholder = $helper.data('$placeholder');
  97. // 修复出现滚动条拖拽位置
  98. var $unitBox = $helper.parents(".unitBox:first"),
  99. position = $helper.offset();
  100. $helper.css({
  101. top:position.top+$unitBox.scrollTop()
  102. });
  103. var $dragList = $($sortBox.attr('drag-rel'));
  104. for (var i=0; i<$dragList.size(); i++) {
  105. var $overBox = DWZ.miscDrag._getOverSortBox($dragList.eq(i), $helper);
  106. if ($overBox.length > 0 && $overBox[0] != $sortBox[0]){ //移动到其他容器
  107. $placeholder.appendTo($overBox);
  108. }
  109. }
  110. },
  111. stopSortDrag:function(){
  112. var $helper = $(arguments[0]), $sortBox = $helper.data('$sortBox'),
  113. $placeholder = $helper.data('$placeholder'), $item = $helper.data('$item');
  114. if ($placeholder && $placeholder.is(':visible')) {
  115. var position = $placeholder.offset();
  116. $helper.animate({
  117. top: (position.top+$sortBox.scrollTop()) + "px",
  118. left: position.left + "px"
  119. },
  120. {
  121. complete: function(){
  122. //复制到目标容器
  123. var $destBox = $placeholder.parents(".sortDrag:first");
  124. //var html = $helper.html()+'<span class="close">×</span>';
  125. var html = $helper.html();
  126. $destBox.append('<div class="dragItem" data-sn="'+$helper.attr('data-sn')+'" data-name="'+$helper.attr('data-name')+'">'+html+'</div>');
  127. $placeholder.remove();
  128. $helper.remove();
  129. if ($sortBox.attr('data-duplicate') != 1) {$item.remove();}
  130. //从新绑定sortDrag
  131. $destBox.sortDrag({refresh:true});
  132. },
  133. duration: 300
  134. }
  135. );
  136. } else {
  137. $placeholder.remove();
  138. $helper.remove();
  139. }
  140. }
  141. };
  142. $.fn.extend({
  143. miscDrag: function(options){
  144. var op = $.extend({
  145. cursor: 'move', // selector 的鼠标手势
  146. sortBoxs: 'div.miscDrag', //拖动排序项父容器
  147. replace: false, //2个sortBox之间拖动替换
  148. items: '> dt .dragBox', //拖动排序项选择器
  149. zIndex: 1000
  150. }, options);
  151. return this.each(function(){
  152. var $box = $(this);
  153. $box.find(op.items).each(function(i){
  154. var $item = $(this);
  155. $item.mousedown(function(event){
  156. DWZ.miscDrag.start($box, $item, event, op);
  157. event.preventDefault();
  158. });
  159. });
  160. });
  161. },
  162. miscDragData: function(){
  163. var $miscDrag = $(this),
  164. $miscSortDrag = $($miscDrag.attr('rel')),
  165. $dragBoxList = $miscDrag.find('dd .dragBox'),
  166. $sortDragList = $miscSortDrag.find('.sortDrag');
  167. var data = [];
  168. for (var i=0; i<$dragBoxList.size(); i++) {
  169. var $dragBox = $dragBoxList.eq(i), $sortDrag = $sortDragList.eq(i),
  170. $dragBoxPos = $dragBox.position();
  171. var dataItem = {
  172. sn: $dragBox.attr('data-sn'),
  173. sequence: $dragBox.attr('data-sequence'),
  174. top: parseInt($dragBoxPos.top),
  175. left: parseInt($dragBoxPos.left),
  176. items: []
  177. };
  178. $sortDrag.find('.dragItem').each(function(index){
  179. var $dragItem = $(this),
  180. $dragItemPos = $dragItem.position();
  181. dataItem.items.push({
  182. sn: $dragItem.attr('data-sn'),
  183. sequence: index + 1
  184. });
  185. });
  186. data.push(dataItem)
  187. }
  188. return data;
  189. },
  190. miscSortDragData: function(){
  191. var $miscSortDrag = $(this),
  192. $sortDragList = $miscSortDrag.find('.sortDrag');
  193. var data = [];
  194. for (var i=0; i<$sortDragList.size(); i++) {
  195. var $sortDrag = $sortDragList.eq(i)
  196. var dataItem = {
  197. sn: $sortDrag.attr('data-sn'),
  198. name: $sortDrag.attr('data-name') || '',
  199. sequence: i+1,
  200. items: []
  201. };
  202. $sortDrag.find('.dragItem').each(function(index){
  203. var $dragItem = $(this);
  204. var itemData = {
  205. sn: $dragItem.attr('data-sn'),
  206. name: $dragItem.attr('data-name') || '',
  207. sequence: index + 1
  208. };
  209. $dragItem.find('.ctl-label :checkbox').each(function(){
  210. var $lable = $(this), lableName = $lable.attr('name');
  211. if (lableName) {
  212. itemData[lableName] = $lable.is(":checked");
  213. }
  214. });
  215. dataItem.items.push(itemData);
  216. });
  217. data.push(dataItem);
  218. }
  219. return data;
  220. },
  221. miscSortDrag: function(options){
  222. var op = $.extend({
  223. cursor: 'move', // selector 的鼠标手势
  224. sortBoxs: 'dl.miscSortDrag', //拖动排序项父容器
  225. replace: false, //2个sortBox之间拖动替换
  226. items: '> dt .dragItem', //拖动排序项选择器
  227. zIndex: 1000
  228. }, options);
  229. return this.each(function(){
  230. var $sortBox = $(this);
  231. $sortBox.find(op.items).each(function(i){
  232. var $item = $(this);
  233. $item.mousedown(function(event){
  234. DWZ.miscDrag.startSortDrag($sortBox, $item, event, op);
  235. event.preventDefault();
  236. });
  237. });
  238. });
  239. }
  240. });
  241. })(jQuery);