summaryrefslogtreecommitdiff
path: root/chimere/static/jme/utils/enterLeave.js
diff options
context:
space:
mode:
Diffstat (limited to 'chimere/static/jme/utils/enterLeave.js')
-rw-r--r--chimere/static/jme/utils/enterLeave.js79
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);