www

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | README

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);