ui.draggable.js 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  1. (function($) {
  2. //Make nodes selectable by expression
  3. $.extend($.expr[':'], { draggable: "(' '+a.className+' ').indexOf(' ui-draggable ')" });
  4. //Macros for external methods that support chaining
  5. var methods = "destroy,enable,disable".split(",");
  6. for(var i=0;i<methods.length;i++) {
  7. var cur = methods[i], f;
  8. eval('f = function() { var a = arguments; return this.each(function() { if(jQuery(this).is(".ui-draggable")) jQuery.data(this, "ui-draggable")["'+cur+'"](a); }); }');
  9. $.fn["draggable"+cur.substr(0,1).toUpperCase()+cur.substr(1)] = f;
  10. };
  11. //get instance method
  12. $.fn.draggableInstance = function() {
  13. if($(this[0]).is(".ui-draggable")) return $.data(this[0], "ui-draggable");
  14. return false;
  15. };
  16. $.fn.draggable = function(o) {
  17. return this.each(function() {
  18. new $.ui.draggable(this, o);
  19. });
  20. }
  21. $.ui.ddmanager = {
  22. current: null,
  23. droppables: [],
  24. prepareOffsets: function(t, e) {
  25. var dropTop = $.ui.ddmanager.dropTop = [];
  26. var dropLeft = $.ui.ddmanager.dropLeft;
  27. var m = $.ui.ddmanager.droppables;
  28. for (var i = 0; i < m.length; i++) {
  29. if(m[i].item.disabled) continue;
  30. m[i].offset = $(m[i].item.element).offset();
  31. if (t && m[i].item.options.accept(t.element)) //Activate the droppable if used directly from draggables
  32. m[i].item.activate.call(m[i].item, e);
  33. }
  34. },
  35. fire: function(oDrag, e) {
  36. var oDrops = $.ui.ddmanager.droppables;
  37. var oOvers = $.grep(oDrops, function(oDrop) {
  38. if (!oDrop.item.disabled && $.ui.intersect(oDrag, oDrop, oDrop.item.options.tolerance))
  39. oDrop.item.drop.call(oDrop.item, e);
  40. });
  41. $.each(oDrops, function(i, oDrop) {
  42. if (!oDrop.item.disabled && oDrop.item.options.accept(oDrag.element)) {
  43. oDrop.out = 1; oDrop.over = 0;
  44. oDrop.item.deactivate.call(oDrop.item, e);
  45. }
  46. });
  47. },
  48. update: function(oDrag, e) {
  49. if(oDrag.options.refreshPositions) $.ui.ddmanager.prepareOffsets();
  50. var oDrops = $.ui.ddmanager.droppables;
  51. var oOvers = $.grep(oDrops, function(oDrop) {
  52. if(oDrop.item.disabled) return false;
  53. var isOver = $.ui.intersect(oDrag, oDrop, oDrop.item.options.tolerance)
  54. if (!isOver && oDrop.over == 1) {
  55. oDrop.out = 1; oDrop.over = 0;
  56. oDrop.item.out.call(oDrop.item, e);
  57. }
  58. return isOver;
  59. });
  60. $.each(oOvers, function(i, oOver) {
  61. if (oOver.over == 0) {
  62. oOver.out = 0; oOver.over = 1;
  63. oOver.item.over.call(oOver.item, e);
  64. }
  65. });
  66. }
  67. };
  68. $.ui.draggable = function(el, o) {
  69. var options = {};
  70. $.extend(options, o);
  71. var self = this;
  72. $.extend(options, {
  73. _start: function(h, p, c, t, e) {
  74. self.start.apply(t, [self, e]); // Trigger the start callback
  75. },
  76. _beforeStop: function(h, p, c, t, e) {
  77. self.stop.apply(t, [self, e]); // Trigger the start callback
  78. },
  79. _drag: function(h, p, c, t, e) {
  80. self.drag.apply(t, [self, e]); // Trigger the start callback
  81. },
  82. startCondition: function(e) {
  83. return !(e.target.className.indexOf("ui-resizable-handle") != -1 || self.disabled);
  84. }
  85. });
  86. $.data(el, "ui-draggable", this);
  87. if (options.ghosting == true) options.helper = 'clone'; //legacy option check
  88. $(el).addClass("ui-draggable");
  89. this.interaction = new $.ui.mouseInteraction(el, options);
  90. }
  91. $.extend($.ui.draggable.prototype, {
  92. plugins: {},
  93. currentTarget: null,
  94. lastTarget: null,
  95. destroy: function() {
  96. $(this.interaction.element).removeClass("ui-draggable").removeClass("ui-draggable-disabled");
  97. this.interaction.destroy();
  98. },
  99. enable: function() {
  100. $(this.interaction.element).removeClass("ui-draggable-disabled");
  101. this.disabled = false;
  102. },
  103. disable: function() {
  104. $(this.interaction.element).addClass("ui-draggable-disabled");
  105. this.disabled = true;
  106. },
  107. prepareCallbackObj: function(self) {
  108. return {
  109. helper: self.helper,
  110. position: { left: self.pos[0], top: self.pos[1] },
  111. offset: self.options.cursorAt,
  112. draggable: self,
  113. options: self.options
  114. }
  115. },
  116. start: function(that, e) {
  117. var o = this.options;
  118. $.ui.ddmanager.current = this;
  119. $.ui.plugin.call(that, 'start', [e, that.prepareCallbackObj(this)]);
  120. $(this.element).triggerHandler("dragstart", [e, that.prepareCallbackObj(this)], o.start);
  121. if (this.slowMode && $.ui.droppable && !o.dropBehaviour)
  122. $.ui.ddmanager.prepareOffsets(this, e);
  123. return false;
  124. },
  125. stop: function(that, e) {
  126. var o = this.options;
  127. $.ui.plugin.call(that, 'stop', [e, that.prepareCallbackObj(this)]);
  128. $(this.element).triggerHandler("dragstop", [e, that.prepareCallbackObj(this)], o.stop);
  129. if (this.slowMode && $.ui.droppable && !o.dropBehaviour) //If cursorAt is within the helper, we must use our drop manager
  130. $.ui.ddmanager.fire(this, e);
  131. $.ui.ddmanager.current = null;
  132. $.ui.ddmanager.last = this;
  133. return false;
  134. },
  135. drag: function(that, e) {
  136. var o = this.options;
  137. $.ui.ddmanager.update(this, e);
  138. this.pos = [this.pos[0]-o.cursorAt.left, this.pos[1]-o.cursorAt.top];
  139. $.ui.plugin.call(that, 'drag', [e, that.prepareCallbackObj(this)]);
  140. var nv = $(this.element).triggerHandler("drag", [e, that.prepareCallbackObj(this)], o.drag);
  141. var nl = (nv && nv.left) ? nv.left : this.pos[0];
  142. var nt = (nv && nv.top) ? nv.top : this.pos[1];
  143. $(this.helper).css('left', nl+'px').css('top', nt+'px'); // Stick the helper to the cursor
  144. return false;
  145. }
  146. });
  147. })($);