ngDraggable.js 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661
  1. /*
  2. *
  3. * https://github.com/fatlinesofcode/ngDraggable
  4. */
  5. angular.module("ngDraggable", [])
  6. .service('ngDraggable', [function() {
  7. var scope = this;
  8. scope.inputEvent = function(event) {
  9. if (angular.isDefined(event.touches)) {
  10. return event.touches[0];
  11. }
  12. //Checking both is not redundent. If only check if touches isDefined, angularjs isDefnied will return error and stop the remaining scripty if event.originalEvent is not defined.
  13. else if (angular.isDefined(event.originalEvent) && angular.isDefined(event.originalEvent.touches)) {
  14. return event.originalEvent.touches[0];
  15. }
  16. return event;
  17. };
  18. scope.touchTimeout = 100;
  19. }])
  20. .directive('ngDrag', ['$rootScope', '$parse', '$document', '$window', 'ngDraggable', function ($rootScope, $parse, $document, $window, ngDraggable) {
  21. return {
  22. restrict: 'A',
  23. link: function (scope, element, attrs) {
  24. scope.value = attrs.ngDrag;
  25. var offset,_centerAnchor=false,_mx,_my,_tx,_ty,_mrx,_mry;
  26. var _hasTouch = ('ontouchstart' in window) || window.DocumentTouch && document instanceof DocumentTouch;
  27. var _pressEvents = 'touchstart mousedown';
  28. var _moveEvents = 'touchmove mousemove';
  29. var _releaseEvents = 'touchend mouseup';
  30. var _dragHandle;
  31. // to identify the element in order to prevent getting superflous events when a single element has both drag and drop directives on it.
  32. var _myid = scope.$id;
  33. var _data = null;
  34. var _dragOffset = null;
  35. var _dragEnabled = false;
  36. var _pressTimer = null;
  37. var onDragStartCallback = $parse(attrs.ngDragStart) || null;
  38. var onDragStopCallback = $parse(attrs.ngDragStop) || null;
  39. var onDragSuccessCallback = $parse(attrs.ngDragSuccess) || null;
  40. var allowTransform = angular.isDefined(attrs.allowTransform) ? scope.$eval(attrs.allowTransform) : true;
  41. var getDragData = $parse(attrs.ngDragData);
  42. // deregistration function for mouse move events in $rootScope triggered by jqLite trigger handler
  43. var _deregisterRootMoveListener = angular.noop;
  44. var initialize = function () {
  45. element.attr('draggable', 'false'); // prevent native drag
  46. // check to see if drag handle(s) was specified
  47. // if querySelectorAll is available, we use this instead of find
  48. // as JQLite find is limited to tagnames
  49. if (element[0].querySelectorAll) {
  50. var dragHandles = angular.element(element[0].querySelectorAll('[ng-drag-handle]'));
  51. } else {
  52. var dragHandles = element.find('[ng-drag-handle]');
  53. }
  54. if (dragHandles.length) {
  55. _dragHandle = dragHandles;
  56. }
  57. toggleListeners(true);
  58. };
  59. var toggleListeners = function (enable) {
  60. if (!enable)return;
  61. // add listeners.
  62. scope.$on('$destroy', onDestroy);
  63. scope.$watch(attrs.ngDrag, onEnableChange);
  64. scope.$watch(attrs.ngCenterAnchor, onCenterAnchor);
  65. // wire up touch events
  66. if (_dragHandle) {
  67. // handle(s) specified, use those to initiate drag
  68. _dragHandle.on(_pressEvents, onpress);
  69. } else {
  70. // no handle(s) specified, use the element as the handle
  71. element.on(_pressEvents, onpress);
  72. }
  73. // if(! _hasTouch && element[0].nodeName.toLowerCase() == "img"){
  74. if( element[0].nodeName.toLowerCase() == "img"){
  75. element.on('mousedown', function(){ return false;}); // prevent native drag for images
  76. }
  77. };
  78. var onDestroy = function (enable) {
  79. toggleListeners(false);
  80. };
  81. var onEnableChange = function (newVal, oldVal) {
  82. _dragEnabled = (newVal);
  83. };
  84. var onCenterAnchor = function (newVal, oldVal) {
  85. if(angular.isDefined(newVal))
  86. _centerAnchor = (newVal || 'true');
  87. };
  88. var isClickableElement = function (evt) {
  89. return (
  90. angular.isDefined(angular.element(evt.target).attr("ng-cancel-drag"))
  91. );
  92. };
  93. /*
  94. * When the element is clicked start the drag behaviour
  95. * On touch devices as a small delay so as not to prevent native window scrolling
  96. */
  97. var onpress = function(evt) {
  98. // console.log("110"+" onpress: "+Math.random()+" "+ evt.type);
  99. if(! _dragEnabled)return;
  100. if (isClickableElement(evt)) {
  101. return;
  102. }
  103. if (evt.type == "mousedown" && evt.button != 0) {
  104. // Do not start dragging on right-click
  105. return;
  106. }
  107. var useTouch = evt.type === 'touchstart' ? true : false;
  108. if(useTouch){
  109. cancelPress();
  110. _pressTimer = setTimeout(function(){
  111. cancelPress();
  112. onlongpress(evt);
  113. onmove(evt);
  114. },ngDraggable.touchTimeout);
  115. $document.on(_moveEvents, cancelPress);
  116. $document.on(_releaseEvents, cancelPress);
  117. }else{
  118. onlongpress(evt);
  119. }
  120. };
  121. var cancelPress = function() {
  122. clearTimeout(_pressTimer);
  123. $document.off(_moveEvents, cancelPress);
  124. $document.off(_releaseEvents, cancelPress);
  125. };
  126. var onlongpress = function(evt) {
  127. if(! _dragEnabled)return;
  128. evt.preventDefault();
  129. offset = element[0].getBoundingClientRect();
  130. if(allowTransform)
  131. _dragOffset = offset;
  132. else{
  133. _dragOffset = {left:document.body.scrollLeft, top:document.body.scrollTop};
  134. }
  135. element.centerX = element[0].offsetWidth / 2;
  136. element.centerY = element[0].offsetHeight / 2;
  137. _mx = ngDraggable.inputEvent(evt).pageX;//ngDraggable.getEventProp(evt, 'pageX');
  138. _my = ngDraggable.inputEvent(evt).pageY;//ngDraggable.getEventProp(evt, 'pageY');
  139. _mrx = _mx - offset.left;
  140. _mry = _my - offset.top;
  141. if (_centerAnchor) {
  142. _tx = _mx - element.centerX - $window.pageXOffset;
  143. _ty = _my - element.centerY - $window.pageYOffset;
  144. } else {
  145. _tx = _mx - _mrx - $window.pageXOffset;
  146. _ty = _my - _mry - $window.pageYOffset;
  147. }
  148. $document.on(_moveEvents, onmove);
  149. $document.on(_releaseEvents, onrelease);
  150. // This event is used to receive manually triggered mouse move events
  151. // jqLite unfortunately only supports triggerHandler(...)
  152. // See http://api.jquery.com/triggerHandler/
  153. // _deregisterRootMoveListener = $rootScope.$on('draggable:_triggerHandlerMove', onmove);
  154. _deregisterRootMoveListener = $rootScope.$on('draggable:_triggerHandlerMove', function(event, origEvent) {
  155. onmove(origEvent);
  156. });
  157. };
  158. var onmove = function (evt) {
  159. if (!_dragEnabled)return;
  160. evt.preventDefault();
  161. if (!element.hasClass('dragging')) {
  162. _data = getDragData(scope);
  163. element.addClass('dragging');
  164. $rootScope.$broadcast('draggable:start', {x:_mx, y:_my, tx:_tx, ty:_ty, event:evt, element:element, data:_data});
  165. if (onDragStartCallback ){
  166. scope.$apply(function () {
  167. onDragStartCallback(scope, {$data: _data, $event: evt});
  168. });
  169. }
  170. }
  171. _mx = ngDraggable.inputEvent(evt).pageX;//ngDraggable.getEventProp(evt, 'pageX');
  172. _my = ngDraggable.inputEvent(evt).pageY;//ngDraggable.getEventProp(evt, 'pageY');
  173. if (_centerAnchor) {
  174. _tx = _mx - element.centerX - _dragOffset.left;
  175. _ty = _my - element.centerY - _dragOffset.top;
  176. } else {
  177. _tx = _mx - _mrx - _dragOffset.left;
  178. _ty = _my - _mry - _dragOffset.top;
  179. }
  180. moveElement(_tx, _ty);
  181. $rootScope.$broadcast('draggable:move', { x: _mx, y: _my, tx: _tx, ty: _ty, event: evt, element: element, data: _data, uid: _myid, dragOffset: _dragOffset });
  182. };
  183. var onrelease = function(evt) {
  184. if (!_dragEnabled)
  185. return;
  186. evt.preventDefault();
  187. $rootScope.$broadcast('draggable:end', {x:_mx, y:_my, tx:_tx, ty:_ty, event:evt, element:element, data:_data, callback:onDragComplete, uid: _myid});
  188. element.removeClass('dragging');
  189. element.parent().find('.drag-enter').removeClass('drag-enter');
  190. reset();
  191. $document.off(_moveEvents, onmove);
  192. $document.off(_releaseEvents, onrelease);
  193. if (onDragStopCallback ){
  194. scope.$apply(function () {
  195. onDragStopCallback(scope, {$data: _data, $event: evt});
  196. });
  197. }
  198. _deregisterRootMoveListener();
  199. };
  200. var onDragComplete = function(evt) {
  201. if (!onDragSuccessCallback )return;
  202. scope.$apply(function () {
  203. onDragSuccessCallback(scope, {$data: _data, $event: evt});
  204. });
  205. };
  206. var reset = function() {
  207. if(allowTransform)
  208. element.css({transform:'', 'z-index':'', '-webkit-transform':'', '-ms-transform':''});
  209. else
  210. element.css({'position':'',top:'',left:''});
  211. };
  212. var moveElement = function (x, y) {
  213. if(allowTransform) {
  214. element.css({
  215. transform: 'matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, ' + x + ', ' + y + ', 0, 1)',
  216. 'z-index': 99999,
  217. '-webkit-transform': 'matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, ' + x + ', ' + y + ', 0, 1)',
  218. '-ms-transform': 'matrix(1, 0, 0, 1, ' + x + ', ' + y + ')'
  219. });
  220. }else{
  221. element.css({'left':x+'px','top':y+'px', 'position':'fixed'});
  222. }
  223. };
  224. initialize();
  225. }
  226. };
  227. }])
  228. .directive('ngDrop', ['$parse', '$timeout', '$window', '$document', 'ngDraggable', function ($parse, $timeout, $window, $document, ngDraggable) {
  229. return {
  230. restrict: 'A',
  231. link: function (scope, element, attrs) {
  232. scope.value = attrs.ngDrop;
  233. scope.isTouching = false;
  234. var _lastDropTouch=null;
  235. var _myid = scope.$id;
  236. var _dropEnabled=false;
  237. var onDropCallback = $parse(attrs.ngDropSuccess);// || function(){};
  238. var onDragStartCallback = $parse(attrs.ngDragStart);
  239. var onDragStopCallback = $parse(attrs.ngDragStop);
  240. var onDragMoveCallback = $parse(attrs.ngDragMove);
  241. var initialize = function () {
  242. toggleListeners(true);
  243. };
  244. var toggleListeners = function (enable) {
  245. // remove listeners
  246. if (!enable)return;
  247. // add listeners.
  248. scope.$watch(attrs.ngDrop, onEnableChange);
  249. scope.$on('$destroy', onDestroy);
  250. scope.$on('draggable:start', onDragStart);
  251. scope.$on('draggable:move', onDragMove);
  252. scope.$on('draggable:end', onDragEnd);
  253. };
  254. var onDestroy = function (enable) {
  255. toggleListeners(false);
  256. };
  257. var onEnableChange = function (newVal, oldVal) {
  258. _dropEnabled=newVal;
  259. };
  260. var onDragStart = function(evt, obj) {
  261. if(! _dropEnabled)return;
  262. isTouching(obj.x,obj.y,obj.element);
  263. if (attrs.ngDragStart) {
  264. $timeout(function(){
  265. onDragStartCallback(scope, {$data: obj.data, $event: obj});
  266. });
  267. }
  268. };
  269. var onDragMove = function(evt, obj) {
  270. if(! _dropEnabled)return;
  271. isTouching(obj.x,obj.y,obj.element);
  272. if (attrs.ngDragMove) {
  273. $timeout(function(){
  274. onDragMoveCallback(scope, {$data: obj.data, $event: obj});
  275. });
  276. }
  277. };
  278. var onDragEnd = function (evt, obj) {
  279. // don't listen to drop events if this is the element being dragged
  280. // only update the styles and return
  281. if (!_dropEnabled || _myid === obj.uid) {
  282. updateDragStyles(false, obj.element);
  283. return;
  284. }
  285. if (isTouching(obj.x, obj.y, obj.element)) {
  286. // call the ngDraggable ngDragSuccess element callback
  287. if(obj.callback){
  288. obj.callback(obj);
  289. }
  290. if (attrs.ngDropSuccess) {
  291. $timeout(function(){
  292. onDropCallback(scope, {$data: obj.data, $event: obj, $target: scope.$eval(scope.value)});
  293. });
  294. }
  295. }
  296. if (attrs.ngDragStop) {
  297. $timeout(function(){
  298. onDragStopCallback(scope, {$data: obj.data, $event: obj});
  299. });
  300. }
  301. updateDragStyles(false, obj.element);
  302. };
  303. var isTouching = function(mouseX, mouseY, dragElement) {
  304. var touching= hitTest(mouseX, mouseY);
  305. scope.isTouching = touching;
  306. if(touching){
  307. _lastDropTouch = element;
  308. }
  309. updateDragStyles(touching, dragElement);
  310. return touching;
  311. };
  312. var updateDragStyles = function(touching, dragElement) {
  313. if(touching){
  314. element.addClass('drag-enter');
  315. dragElement.addClass('drag-over');
  316. }else if(_lastDropTouch == element){
  317. _lastDropTouch=null;
  318. element.removeClass('drag-enter');
  319. dragElement.removeClass('drag-over');
  320. }
  321. };
  322. var hitTest = function(x, y) {
  323. var bounds = element[0].getBoundingClientRect();// ngDraggable.getPrivOffset(element);
  324. x -= $document[0].body.scrollLeft + $document[0].documentElement.scrollLeft;
  325. y -= $document[0].body.scrollTop + $document[0].documentElement.scrollTop;
  326. return x >= bounds.left
  327. && x <= bounds.right
  328. && y <= bounds.bottom
  329. && y >= bounds.top;
  330. };
  331. initialize();
  332. }
  333. };
  334. }])
  335. .directive('ngDragClone', ['$parse', '$timeout', 'ngDraggable', function ($parse, $timeout, ngDraggable) {
  336. return {
  337. restrict: 'A',
  338. link: function (scope, element, attrs) {
  339. var img, _allowClone=true;
  340. var _dragOffset = null;
  341. scope.clonedData = {};
  342. var initialize = function () {
  343. img = element.find('img');
  344. element.attr('draggable', 'false');
  345. img.attr('draggable', 'false');
  346. reset();
  347. toggleListeners(true);
  348. };
  349. var toggleListeners = function (enable) {
  350. // remove listeners
  351. if (!enable)return;
  352. // add listeners.
  353. scope.$on('draggable:start', onDragStart);
  354. scope.$on('draggable:move', onDragMove);
  355. scope.$on('draggable:end', onDragEnd);
  356. preventContextMenu();
  357. };
  358. var preventContextMenu = function() {
  359. // element.off('mousedown touchstart touchmove touchend touchcancel', absorbEvent_);
  360. img.off('mousedown touchstart touchmove touchend touchcancel', absorbEvent_);
  361. // element.on('mousedown touchstart touchmove touchend touchcancel', absorbEvent_);
  362. img.on('mousedown touchstart touchmove touchend touchcancel', absorbEvent_);
  363. };
  364. var onDragStart = function(evt, obj, elm) {
  365. _allowClone=true;
  366. if(angular.isDefined(obj.data.allowClone)){
  367. _allowClone=obj.data.allowClone;
  368. }
  369. if(_allowClone) {
  370. scope.$apply(function () {
  371. scope.clonedData = obj.data;
  372. });
  373. element.css('width', obj.element[0].offsetWidth);
  374. element.css('height', obj.element[0].offsetHeight);
  375. moveElement(obj.tx, obj.ty);
  376. }
  377. };
  378. var onDragMove = function(evt, obj) {
  379. if(_allowClone) {
  380. _tx = obj.tx + obj.dragOffset.left;
  381. _ty = obj.ty + obj.dragOffset.top;
  382. moveElement(_tx, _ty);
  383. }
  384. };
  385. var onDragEnd = function(evt, obj) {
  386. //moveElement(obj.tx,obj.ty);
  387. if(_allowClone) {
  388. reset();
  389. }
  390. };
  391. var reset = function() {
  392. element.css({left:0,top:0, position:'fixed', 'z-index':-1, visibility:'hidden'});
  393. };
  394. var moveElement = function(x,y) {
  395. element.css({
  396. transform: 'matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, '+x+', '+y+', 0, 1)', 'z-index': 99999, 'visibility': 'visible',
  397. '-webkit-transform': 'matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, '+x+', '+y+', 0, 1)',
  398. '-ms-transform': 'matrix(1, 0, 0, 1, '+x+', '+y+')'
  399. //,margin: '0' don't monkey with the margin,
  400. });
  401. };
  402. var absorbEvent_ = function (event) {
  403. var e = event;//.originalEvent;
  404. e.preventDefault && e.preventDefault();
  405. e.stopPropagation && e.stopPropagation();
  406. e.cancelBubble = true;
  407. e.returnValue = false;
  408. return false;
  409. };
  410. initialize();
  411. }
  412. };
  413. }])
  414. .directive('ngPreventDrag', ['$parse', '$timeout', function ($parse, $timeout) {
  415. return {
  416. restrict: 'A',
  417. link: function (scope, element, attrs) {
  418. var initialize = function () {
  419. element.attr('draggable', 'false');
  420. toggleListeners(true);
  421. };
  422. var toggleListeners = function (enable) {
  423. // remove listeners
  424. if (!enable)return;
  425. // add listeners.
  426. element.on('mousedown touchstart touchmove touchend touchcancel', absorbEvent_);
  427. };
  428. var absorbEvent_ = function (event) {
  429. var e = event.originalEvent;
  430. e.preventDefault && e.preventDefault();
  431. e.stopPropagation && e.stopPropagation();
  432. e.cancelBubble = true;
  433. e.returnValue = false;
  434. return false;
  435. };
  436. initialize();
  437. }
  438. };
  439. }])
  440. .directive('ngCancelDrag', [function () {
  441. return {
  442. restrict: 'A',
  443. link: function (scope, element, attrs) {
  444. element.find('*').attr('ng-cancel-drag', 'ng-cancel-drag');
  445. }
  446. };
  447. }])
  448. .directive('ngDragScroll', ['$window', '$interval', '$timeout', '$document', '$rootScope', function($window, $interval, $timeout, $document, $rootScope) {
  449. return {
  450. restrict: 'A',
  451. link: function(scope, element, attrs) {
  452. var intervalPromise = null;
  453. var lastMouseEvent = null;
  454. var config = {
  455. verticalScroll: attrs.verticalScroll || true,
  456. horizontalScroll: attrs.horizontalScroll || true,
  457. activationDistance: attrs.activationDistance || 75,
  458. scrollDistance: attrs.scrollDistance || 15
  459. };
  460. var reqAnimFrame = (function() {
  461. return window.requestAnimationFrame ||
  462. window.webkitRequestAnimationFrame ||
  463. window.mozRequestAnimationFrame ||
  464. window.oRequestAnimationFrame ||
  465. window.msRequestAnimationFrame ||
  466. function( /* function FrameRequestCallback */ callback, /* DOMElement Element */ element ) {
  467. window.setTimeout(callback, 1000 / 60);
  468. };
  469. })();
  470. var animationIsOn = false;
  471. var createInterval = function() {
  472. animationIsOn = true;
  473. function nextFrame(callback) {
  474. var args = Array.prototype.slice.call(arguments);
  475. if(animationIsOn) {
  476. reqAnimFrame(function () {
  477. $rootScope.$apply(function () {
  478. callback.apply(null, args);
  479. nextFrame(callback);
  480. });
  481. })
  482. }
  483. }
  484. nextFrame(function() {
  485. if (!lastMouseEvent) return;
  486. var viewportWidth = Math.max(document.documentElement.clientWidth, window.innerWidth || 0);
  487. var viewportHeight = Math.max(document.documentElement.clientHeight, window.innerHeight || 0);
  488. var scrollX = 0;
  489. var scrollY = 0;
  490. if (config.horizontalScroll) {
  491. // If horizontal scrolling is active.
  492. if (lastMouseEvent.clientX < config.activationDistance) {
  493. // If the mouse is on the left of the viewport within the activation distance.
  494. scrollX = -config.scrollDistance;
  495. }
  496. else if (lastMouseEvent.clientX > viewportWidth - config.activationDistance) {
  497. // If the mouse is on the right of the viewport within the activation distance.
  498. scrollX = config.scrollDistance;
  499. }
  500. }
  501. if (config.verticalScroll) {
  502. // If vertical scrolling is active.
  503. if (lastMouseEvent.clientY < config.activationDistance) {
  504. // If the mouse is on the top of the viewport within the activation distance.
  505. scrollY = -config.scrollDistance;
  506. }
  507. else if (lastMouseEvent.clientY > viewportHeight - config.activationDistance) {
  508. // If the mouse is on the bottom of the viewport within the activation distance.
  509. scrollY = config.scrollDistance;
  510. }
  511. }
  512. if (scrollX !== 0 || scrollY !== 0) {
  513. // Record the current scroll position.
  514. var currentScrollLeft = ($window.pageXOffset || $document[0].documentElement.scrollLeft);
  515. var currentScrollTop = ($window.pageYOffset || $document[0].documentElement.scrollTop);
  516. // Remove the transformation from the element, scroll the window by the scroll distance
  517. // record how far we scrolled, then reapply the element transformation.
  518. var elementTransform = element.css('transform');
  519. element.css('transform', 'initial');
  520. $window.scrollBy(scrollX, scrollY);
  521. var horizontalScrollAmount = ($window.pageXOffset || $document[0].documentElement.scrollLeft) - currentScrollLeft;
  522. var verticalScrollAmount = ($window.pageYOffset || $document[0].documentElement.scrollTop) - currentScrollTop;
  523. element.css('transform', elementTransform);
  524. lastMouseEvent.pageX += horizontalScrollAmount;
  525. lastMouseEvent.pageY += verticalScrollAmount;
  526. $rootScope.$emit('draggable:_triggerHandlerMove', lastMouseEvent);
  527. }
  528. });
  529. };
  530. var clearInterval = function() {
  531. animationIsOn = false;
  532. };
  533. scope.$on('draggable:start', function(event, obj) {
  534. // Ignore this event if it's not for this element.
  535. if (obj.element[0] !== element[0]) return;
  536. if (!animationIsOn) createInterval();
  537. });
  538. scope.$on('draggable:end', function(event, obj) {
  539. // Ignore this event if it's not for this element.
  540. if (obj.element[0] !== element[0]) return;
  541. if (animationIsOn) clearInterval();
  542. });
  543. scope.$on('draggable:move', function(event, obj) {
  544. // Ignore this event if it's not for this element.
  545. if (obj.element[0] !== element[0]) return;
  546. lastMouseEvent = obj.event;
  547. });
  548. }
  549. };
  550. }]);