diff options
Diffstat (limited to 'chimere/static/jme/utils/enterLeave.js')
| -rw-r--r-- | chimere/static/jme/utils/enterLeave.js | 79 | 
1 files changed, 79 insertions, 0 deletions
| diff --git a/chimere/static/jme/utils/enterLeave.js b/chimere/static/jme/utils/enterLeave.js new file mode 100644 index 0000000..07d96cc --- /dev/null +++ b/chimere/static/jme/utils/enterLeave.js @@ -0,0 +1,79 @@ +(function($){ +	/* +	*  enterLeave +	*  similiar to hover, but more accessible +	*  hover = focusblur +	*/ +	var inReg = /focusin|focus$|mouseenter|mouseover/;	 +	$.fn.enterLeave = function(enter, out, opts){ +		opts = $.extend({}, $.fn.enterLeave.defaults, opts); +		 +		var eventTypes 	= 'mouseenter mouseleave focusin focusout', +			selector 	= this.selector, +			context 	= this.context +		; +		 +		if(opts.useEventTypes === 'mouse'){ +			eventTypes = 'mouseenter mouseleave'; +		} else if(opts.useEventTypes === 'focus'){ +			eventTypes = 'focusin focusout'; +		} +		 +		 + +		this +			.each(function(){ +				var inOutData = {inEvents: 0}; +				function handler(e){ +					var fn, +						params, +						elem = this, +						evt +					; +					if(inReg.test(e.type)){ +						fn = enter; +						params =  [1, 'in', true]; +						//webkit autoblur prevention  +						if(opts.useWebkitAutoBlur){ +							inOutData.autoBlur = true;  +							setTimeout(function(){ +								inOutData.autoBlur = false; +							}, 0); +						} +					} else { +						fn = out; +						params = [-1, 'out', false]; +						if(inOutData.autoBlur){ +							return; +						} +					} +					 +					clearTimeout(inOutData.inOutTimer); +					inOutData.inEvents = Math.max(inOutData.inEvents + params[0], 0); +					inOutData.inOutTimer = setTimeout(function(){ +						if(params[2] != inOutData.inOutState &&  +								(params[2] || !opts.bothOut || !inOutData.inEvents)){ +							 +							inOutData.inOutState = params[2]; +							evt = $.Event(params[1]); +							evt.originalEvent = e; +							fn.call(elem, evt); +						} +					}, /focus/.test(e.type) ? opts.keyDelay : opts.mouseDelay); +				} +				$(this)[opts.bindStyle](eventTypes, handler); +			}); +		return this; +	}; +	 +	$.fn.enterLeave.defaults = { +		mouseDelay: 0, +		bindStyle: 'bind', // bind | live | bubbleLive +		keyDelay: 1, +		bothOut: false, +		useEventTypes: 'both', // both || mouse || focus +		useWebkitAutoBlur: false +	}; +	 +	$.fn.inOut = $.fn.enterLeave; +})(jQuery); | 
