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