152 lines
4 KiB
JavaScript
152 lines
4 KiB
JavaScript
/*!
|
|
* jQuery UI Mouse 1.8.5
|
|
*
|
|
* Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
|
|
* Dual licensed under the MIT or GPL Version 2 licenses.
|
|
* http://jquery.org/license
|
|
*
|
|
* http://docs.jquery.com/UI/Mouse
|
|
*
|
|
* Depends:
|
|
* jquery.ui.widget.js
|
|
*/
|
|
(function( $, undefined ) {
|
|
|
|
$.widget("ui.mouse", {
|
|
options: {
|
|
cancel: ':input,option',
|
|
distance: 1,
|
|
delay: 0
|
|
},
|
|
_mouseInit: function() {
|
|
var self = this;
|
|
|
|
this.element
|
|
.bind('mousedown.'+this.widgetName, function(event) {
|
|
return self._mouseDown(event);
|
|
})
|
|
.bind('click.'+this.widgetName, function(event) {
|
|
if(self._preventClickEvent) {
|
|
self._preventClickEvent = false;
|
|
event.stopImmediatePropagation();
|
|
return false;
|
|
}
|
|
});
|
|
|
|
this.started = false;
|
|
},
|
|
|
|
// TODO: make sure destroying one instance of mouse doesn't mess with
|
|
// other instances of mouse
|
|
_mouseDestroy: function() {
|
|
this.element.unbind('.'+this.widgetName);
|
|
},
|
|
|
|
_mouseDown: function(event) {
|
|
// don't let more than one widget handle mouseStart
|
|
// TODO: figure out why we have to use originalEvent
|
|
event.originalEvent = event.originalEvent || {};
|
|
if (event.originalEvent.mouseHandled) { return; }
|
|
|
|
// we may have missed mouseup (out of window)
|
|
(this._mouseStarted && this._mouseUp(event));
|
|
|
|
this._mouseDownEvent = event;
|
|
|
|
var self = this,
|
|
btnIsLeft = (event.which == 1),
|
|
elIsCancel = (typeof this.options.cancel == "string" ? $(event.target).parents().add(event.target).filter(this.options.cancel).length : false);
|
|
if (!btnIsLeft || elIsCancel || !this._mouseCapture(event)) {
|
|
return true;
|
|
}
|
|
|
|
this.mouseDelayMet = !this.options.delay;
|
|
if (!this.mouseDelayMet) {
|
|
this._mouseDelayTimer = setTimeout(function() {
|
|
self.mouseDelayMet = true;
|
|
}, this.options.delay);
|
|
}
|
|
|
|
if (this._mouseDistanceMet(event) && this._mouseDelayMet(event)) {
|
|
this._mouseStarted = (this._mouseStart(event) !== false);
|
|
if (!this._mouseStarted) {
|
|
event.preventDefault();
|
|
return true;
|
|
}
|
|
}
|
|
|
|
// these delegates are required to keep context
|
|
this._mouseMoveDelegate = function(event) {
|
|
return self._mouseMove(event);
|
|
};
|
|
this._mouseUpDelegate = function(event) {
|
|
return self._mouseUp(event);
|
|
};
|
|
$(document)
|
|
.bind('mousemove.'+this.widgetName, this._mouseMoveDelegate)
|
|
.bind('mouseup.'+this.widgetName, this._mouseUpDelegate);
|
|
|
|
// preventDefault() is used to prevent the selection of text here -
|
|
// however, in Safari, this causes select boxes not to be selectable
|
|
// anymore, so this fix is needed
|
|
($.browser.safari || event.preventDefault());
|
|
|
|
event.originalEvent.mouseHandled = true;
|
|
return true;
|
|
},
|
|
|
|
_mouseMove: function(event) {
|
|
// IE mouseup check - mouseup happened when mouse was out of window
|
|
if ($.browser.msie && !event.button) {
|
|
return this._mouseUp(event);
|
|
}
|
|
|
|
if (this._mouseStarted) {
|
|
this._mouseDrag(event);
|
|
return event.preventDefault();
|
|
}
|
|
|
|
if (this._mouseDistanceMet(event) && this._mouseDelayMet(event)) {
|
|
this._mouseStarted =
|
|
(this._mouseStart(this._mouseDownEvent, event) !== false);
|
|
(this._mouseStarted ? this._mouseDrag(event) : this._mouseUp(event));
|
|
}
|
|
|
|
return !this._mouseStarted;
|
|
},
|
|
|
|
_mouseUp: function(event) {
|
|
$(document)
|
|
.unbind('mousemove.'+this.widgetName, this._mouseMoveDelegate)
|
|
.unbind('mouseup.'+this.widgetName, this._mouseUpDelegate);
|
|
|
|
if (this._mouseStarted) {
|
|
this._mouseStarted = false;
|
|
this._preventClickEvent = (event.target == this._mouseDownEvent.target);
|
|
this._mouseStop(event);
|
|
}
|
|
|
|
return false;
|
|
},
|
|
|
|
_mouseDistanceMet: function(event) {
|
|
return (Math.max(
|
|
Math.abs(this._mouseDownEvent.pageX - event.pageX),
|
|
Math.abs(this._mouseDownEvent.pageY - event.pageY)
|
|
) >= this.options.distance
|
|
);
|
|
},
|
|
|
|
_mouseDelayMet: function(event) {
|
|
return this.mouseDelayMet;
|
|
},
|
|
|
|
// These are placeholder methods, to be overriden by extending plugin
|
|
_mouseStart: function(event) {},
|
|
_mouseDrag: function(event) {},
|
|
_mouseStop: function(event) {},
|
|
_mouseCapture: function(event) { return true; }
|
|
});
|
|
|
|
})(jQuery);
|