2 * jQuery UI Mouse 1.8.18
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
8 * http://docs.jquery.com/UI/Mouse
13 (function( $, undefined ) {
15 var mouseHandled
= false;
16 $( document
).mouseup( function( e
) {
20 $.widget("ui.mouse", {
22 cancel
: ':input,option',
26 _mouseInit: function() {
30 .bind('mousedown.'+this.widgetName
, function(event
) {
31 return self
._mouseDown(event
);
33 .bind('click.'+this.widgetName
, function(event
) {
34 if (true === $.data(event
.target
, self
.widgetName
+ '.preventClickEvent')) {
35 $.removeData(event
.target
, self
.widgetName
+ '.preventClickEvent');
36 event
.stopImmediatePropagation();
44 // TODO: make sure destroying one instance of mouse doesn't mess with
45 // other instances of mouse
46 _mouseDestroy: function() {
47 this.element
.unbind('.'+this.widgetName
);
50 _mouseDown: function(event
) {
51 // don't let more than one widget handle mouseStart
52 if( mouseHandled
) { return };
54 // we may have missed mouseup (out of window)
55 (this._mouseStarted
&& this._mouseUp(event
));
57 this._mouseDownEvent
= event
;
60 btnIsLeft
= (event
.which
== 1),
61 // event.target.nodeName works around a bug in IE 8 with
62 // disabled inputs (#7620)
63 elIsCancel
= (typeof this.options
.cancel
== "string" && event
.target
.nodeName
? $(event
.target
).closest(this.options
.cancel
).length
: false);
64 if (!btnIsLeft
|| elIsCancel
|| !this._mouseCapture(event
)) {
68 this.mouseDelayMet
= !this.options
.delay
;
69 if (!this.mouseDelayMet
) {
70 this._mouseDelayTimer
= setTimeout(function() {
71 self
.mouseDelayMet
= true;
72 }, this.options
.delay
);
75 if (this._mouseDistanceMet(event
) && this._mouseDelayMet(event
)) {
76 this._mouseStarted
= (this._mouseStart(event
) !== false);
77 if (!this._mouseStarted
) {
78 event
.preventDefault();
83 // Click event may never have fired (Gecko & Opera)
84 if (true === $.data(event
.target
, this.widgetName
+ '.preventClickEvent')) {
85 $.removeData(event
.target
, this.widgetName
+ '.preventClickEvent');
88 // these delegates are required to keep context
89 this._mouseMoveDelegate = function(event
) {
90 return self
._mouseMove(event
);
92 this._mouseUpDelegate = function(event
) {
93 return self
._mouseUp(event
);
96 .bind('mousemove.'+this.widgetName
, this._mouseMoveDelegate
)
97 .bind('mouseup.'+this.widgetName
, this._mouseUpDelegate
);
99 event
.preventDefault();
105 _mouseMove: function(event
) {
106 // IE mouseup check - mouseup happened when mouse was out of window
107 if ($.browser
.msie
&& !(document
.documentMode
>= 9) && !event
.button
) {
108 return this._mouseUp(event
);
111 if (this._mouseStarted
) {
112 this._mouseDrag(event
);
113 return event
.preventDefault();
116 if (this._mouseDistanceMet(event
) && this._mouseDelayMet(event
)) {
118 (this._mouseStart(this._mouseDownEvent
, event
) !== false);
119 (this._mouseStarted
? this._mouseDrag(event
) : this._mouseUp(event
));
122 return !this._mouseStarted
;
125 _mouseUp: function(event
) {
127 .unbind('mousemove.'+this.widgetName
, this._mouseMoveDelegate
)
128 .unbind('mouseup.'+this.widgetName
, this._mouseUpDelegate
);
130 if (this._mouseStarted
) {
131 this._mouseStarted
= false;
133 if (event
.target
== this._mouseDownEvent
.target
) {
134 $.data(event
.target
, this.widgetName
+ '.preventClickEvent', true);
137 this._mouseStop(event
);
143 _mouseDistanceMet: function(event
) {
145 Math
.abs(this._mouseDownEvent
.pageX
- event
.pageX
),
146 Math
.abs(this._mouseDownEvent
.pageY
- event
.pageY
)
147 ) >= this.options
.distance
151 _mouseDelayMet: function(event
) {
152 return this.mouseDelayMet
;
155 // These are placeholder methods, to be overriden by extending plugin
156 _mouseStart: function(event
) {},
157 _mouseDrag: function(event
) {},
158 _mouseStop: function(event
) {},
159 _mouseCapture: function(event
) { return true; }