jquery.ui.mouse.js 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  1. /*!
  2. * jQuery UI Mouse 1.8.11
  3. *
  4. * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
  5. * Dual licensed under the MIT or GPL Version 2 licenses.
  6. * http://jquery.org/license
  7. *
  8. * http://docs.jquery.com/UI/Mouse
  9. *
  10. * Depends:
  11. * jquery.ui.widget.js
  12. */
  13. (function( $, undefined ) {
  14. $.widget("ui.mouse", {
  15. options: {
  16. cancel: ':input,option',
  17. distance: 1,
  18. delay: 0
  19. },
  20. _mouseInit: function() {
  21. var self = this;
  22. this.element
  23. .bind('mousedown.'+this.widgetName, function(event) {
  24. return self._mouseDown(event);
  25. })
  26. .bind('click.'+this.widgetName, function(event) {
  27. if (true === $.data(event.target, self.widgetName + '.preventClickEvent')) {
  28. $.removeData(event.target, self.widgetName + '.preventClickEvent');
  29. event.stopImmediatePropagation();
  30. return false;
  31. }
  32. });
  33. this.started = false;
  34. },
  35. // TODO: make sure destroying one instance of mouse doesn't mess with
  36. // other instances of mouse
  37. _mouseDestroy: function() {
  38. this.element.unbind('.'+this.widgetName);
  39. },
  40. _mouseDown: function(event) {
  41. // don't let more than one widget handle mouseStart
  42. // TODO: figure out why we have to use originalEvent
  43. event.originalEvent = event.originalEvent || {};
  44. if (event.originalEvent.mouseHandled) { return; }
  45. // we may have missed mouseup (out of window)
  46. (this._mouseStarted && this._mouseUp(event));
  47. this._mouseDownEvent = event;
  48. var self = this,
  49. btnIsLeft = (event.which == 1),
  50. elIsCancel = (typeof this.options.cancel == "string" ? $(event.target).parents().add(event.target).filter(this.options.cancel).length : false);
  51. if (!btnIsLeft || elIsCancel || !this._mouseCapture(event)) {
  52. return true;
  53. }
  54. this.mouseDelayMet = !this.options.delay;
  55. if (!this.mouseDelayMet) {
  56. this._mouseDelayTimer = setTimeout(function() {
  57. self.mouseDelayMet = true;
  58. }, this.options.delay);
  59. }
  60. if (this._mouseDistanceMet(event) && this._mouseDelayMet(event)) {
  61. this._mouseStarted = (this._mouseStart(event) !== false);
  62. if (!this._mouseStarted) {
  63. event.preventDefault();
  64. return true;
  65. }
  66. }
  67. // Click event may never have fired (Gecko & Opera)
  68. if (true === $.data(event.target, this.widgetName + '.preventClickEvent')) {
  69. $.removeData(event.target, this.widgetName + '.preventClickEvent');
  70. }
  71. // these delegates are required to keep context
  72. this._mouseMoveDelegate = function(event) {
  73. return self._mouseMove(event);
  74. };
  75. this._mouseUpDelegate = function(event) {
  76. return self._mouseUp(event);
  77. };
  78. $(document)
  79. .bind('mousemove.'+this.widgetName, this._mouseMoveDelegate)
  80. .bind('mouseup.'+this.widgetName, this._mouseUpDelegate);
  81. event.preventDefault();
  82. event.originalEvent.mouseHandled = true;
  83. return true;
  84. },
  85. _mouseMove: function(event) {
  86. // IE mouseup check - mouseup happened when mouse was out of window
  87. if ($.browser.msie && !(document.documentMode >= 9) && !event.button) {
  88. return this._mouseUp(event);
  89. }
  90. if (this._mouseStarted) {
  91. this._mouseDrag(event);
  92. return event.preventDefault();
  93. }
  94. if (this._mouseDistanceMet(event) && this._mouseDelayMet(event)) {
  95. this._mouseStarted =
  96. (this._mouseStart(this._mouseDownEvent, event) !== false);
  97. (this._mouseStarted ? this._mouseDrag(event) : this._mouseUp(event));
  98. }
  99. return !this._mouseStarted;
  100. },
  101. _mouseUp: function(event) {
  102. $(document)
  103. .unbind('mousemove.'+this.widgetName, this._mouseMoveDelegate)
  104. .unbind('mouseup.'+this.widgetName, this._mouseUpDelegate);
  105. if (this._mouseStarted) {
  106. this._mouseStarted = false;
  107. if (event.target == this._mouseDownEvent.target) {
  108. $.data(event.target, this.widgetName + '.preventClickEvent', true);
  109. }
  110. this._mouseStop(event);
  111. }
  112. return false;
  113. },
  114. _mouseDistanceMet: function(event) {
  115. return (Math.max(
  116. Math.abs(this._mouseDownEvent.pageX - event.pageX),
  117. Math.abs(this._mouseDownEvent.pageY - event.pageY)
  118. ) >= this.options.distance
  119. );
  120. },
  121. _mouseDelayMet: function(event) {
  122. return this.mouseDelayMet;
  123. },
  124. // These are placeholder methods, to be overriden by extending plugin
  125. _mouseStart: function(event) {},
  126. _mouseDrag: function(event) {},
  127. _mouseStop: function(event) {},
  128. _mouseCapture: function(event) { return true; }
  129. });
  130. })(jQuery);