2 * jQuery UI Mouse 1.8.11
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 $.widget("ui.mouse", {
17 cancel
: ':input,option',
21 _mouseInit: function() {
25 .bind('mousedown.'+this.widgetName
, function(event
) {
26 return self
._mouseDown(event
);
28 .bind('click.'+this.widgetName
, function(event
) {
29 if (true === $.data(event
.target
, self
.widgetName
+ '.preventClickEvent')) {
30 $.removeData(event
.target
, self
.widgetName
+ '.preventClickEvent');
31 event
.stopImmediatePropagation();
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
);
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; }
51 // we may have missed mouseup (out of window)
52 (this._mouseStarted
&& this._mouseUp(event
));
54 this._mouseDownEvent
= event
;
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
)) {
63 this.mouseDelayMet
= !this.options
.delay
;
64 if (!this.mouseDelayMet
) {
65 this._mouseDelayTimer
= setTimeout(function() {
66 self
.mouseDelayMet
= true;
67 }, this.options
.delay
);
70 if (this._mouseDistanceMet(event
) && this._mouseDelayMet(event
)) {
71 this._mouseStarted
= (this._mouseStart(event
) !== false);
72 if (!this._mouseStarted
) {
73 event
.preventDefault();
78 // Click event may never have fired (Gecko & Opera)
79 if (true === $.data(event
.target
, this.widgetName
+ '.preventClickEvent')) {
80 $.removeData(event
.target
, this.widgetName
+ '.preventClickEvent');
83 // these delegates are required to keep context
84 this._mouseMoveDelegate = function(event
) {
85 return self
._mouseMove(event
);
87 this._mouseUpDelegate = function(event
) {
88 return self
._mouseUp(event
);
91 .bind('mousemove.'+this.widgetName
, this._mouseMoveDelegate
)
92 .bind('mouseup.'+this.widgetName
, this._mouseUpDelegate
);
94 event
.preventDefault();
95 event
.originalEvent
.mouseHandled
= true;
99 _mouseMove: function(event
) {
100 // IE mouseup check - mouseup happened when mouse was out of window
101 if ($.browser
.msie
&& !(document
.documentMode
>= 9) && !event
.button
) {
102 return this._mouseUp(event
);
105 if (this._mouseStarted
) {
106 this._mouseDrag(event
);
107 return event
.preventDefault();
110 if (this._mouseDistanceMet(event
) && this._mouseDelayMet(event
)) {
112 (this._mouseStart(this._mouseDownEvent
, event
) !== false);
113 (this._mouseStarted
? this._mouseDrag(event
) : this._mouseUp(event
));
116 return !this._mouseStarted
;
119 _mouseUp: function(event
) {
121 .unbind('mousemove.'+this.widgetName
, this._mouseMoveDelegate
)
122 .unbind('mouseup.'+this.widgetName
, this._mouseUpDelegate
);
124 if (this._mouseStarted
) {
125 this._mouseStarted
= false;
127 if (event
.target
== this._mouseDownEvent
.target
) {
128 $.data(event
.target
, this.widgetName
+ '.preventClickEvent', true);
131 this._mouseStop(event
);
137 _mouseDistanceMet: function(event
) {
139 Math
.abs(this._mouseDownEvent
.pageX
- event
.pageX
),
140 Math
.abs(this._mouseDownEvent
.pageY
- event
.pageY
)
141 ) >= this.options
.distance
145 _mouseDelayMet: function(event
) {
146 return this.mouseDelayMet
;
149 // These are placeholder methods, to be overriden by extending plugin
150 _mouseStart: function(event
) {},
151 _mouseDrag: function(event
) {},
152 _mouseStop: function(event
) {},
153 _mouseCapture: function(event
) { return true; }