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/** * hoverIntent is similar to jQuery's built-in "hover" function except that * instead of firing the onMouseOver event immediately, hoverIntent checks * to see if the user's mouse has slowed down (beneath the sensitivity * threshold) before firing the onMouseOver event. * * hoverIntent r5 // 2007.03.27 // jQuery 1.1.2+ * * * hoverIntent is currently available for use in all personal or commercial * projects under both MIT and GPL licenses. This means that you can choose * the license that best suits your project, and use it accordingly. * * // basic usage (just like .hover) receives onMouseOver and onMouseOut functions * $("ul li").hoverIntent( showNav , hideNav ); * * // advanced usage receives configuration object only * $("ul li").hoverIntent({ * sensitivity: 7, // number = sensitivity threshold (must be 1 or higher) * interval: 100, // number = milliseconds of polling interval * over: showNav, // function = onMouseOver callback (required) * timeout: 0, // number = milliseconds delay before onMouseOut function call * out: hideNav // function = onMouseOut callback (required) * }); * * @param f onMouseOver function || An object with configuration options * @param g onMouseOut function || Nothing (use configuration options object) * @author Brian Cherne */ (function($) { $.fn.hoverIntent = function(f,g) { // default configuration options var cfg = { sensitivity: 10, interval: 0, timeout: 0 }; // override configuration options with user supplied object cfg = $.extend(cfg, g ? { over: f, out: g } : f ); // instantiate variables // cX, cY = current X and Y position of mouse, updated by mousemove event // pX, pY = previous X and Y position of mouse, set by mouseover and polling interval var cX, cY, pX, pY; // A private function for getting mouse position var track = function(ev) { cX = ev.pageX; cY = ev.pageY; }; // A private function for comparing current and previous mouse position var compare = function(ev,ob) { ob.hoverIntent_t = clearTimeout(ob.hoverIntent_t); // compare mouse positions to see if they've crossed the threshold if ( ( Math.abs(pX-cX) + Math.abs(pY-cY) ) < cfg.sensitivity ) { $(ob).unbind("mousemove",track); // set hoverIntent state to true (so mouseOut can be called) ob.hoverIntent_s = 1; return cfg.over.apply(ob,[ev]); } else { // set previous coordinates for next time pX = cX; pY = cY; // use self-calling timeout, guarantees intervals are spaced out properly (avoids JavaScript timer bugs) ob.hoverIntent_t = setTimeout( function(){compare(ev, ob);} , cfg.interval ); } }; // A private function for delaying the mouseOut function var delay = function(ev,ob) { ob.hoverIntent_t = clearTimeout(ob.hoverIntent_t); ob.hoverIntent_s = 0; return cfg.out.apply(ob,[ev]); }; // A private function for handling mouse 'hovering' var handleHover = function(e) { // next three lines copied from jQuery.hover, ignore children onMouseOver/onMouseOut var p = (e.type == "mouseover" ? e.fromElement : e.toElement) || e.relatedTarget; while ( p && p != this ) { try { p = p.parentNode; } catch(e) { p = this; } } if ( p == this ) { return false; } // copy objects to be passed into t (required for event object to be passed in IE) var ev = jQuery.extend({},e); var ob = this; // cancel hoverIntent timer if it exists if (ob.hoverIntent_t) { ob.hoverIntent_t = clearTimeout(ob.hoverIntent_t); } // else e.type == "onmouseover" if (e.type == "mouseover") { // set "previous" X and Y position based on initial entry point pX = ev.pageX; pY = ev.pageY; // update "current" X and Y position based on mousemove $(ob).bind("mousemove",track); // start polling interval (self-calling timeout) to compare mouse coordinates over time if (ob.hoverIntent_s != 1) { ob.hoverIntent_t = setTimeout( function(){compare(ev,ob);} , cfg.interval );} // else e.type == "onmouseout" } else { // unbind expensive mousemove event $(ob).unbind("mousemove",track); // if hoverIntent state is true, then call the mouseOut function after the specified delay if (ob.hoverIntent_s == 1) { ob.hoverIntent_t = setTimeout( function(){delay(ev,ob);} , cfg.timeout );} } }; // bind the function to the two event listeners return this.mouseover(handleHover).mouseout(handleHover); }; })(jQuery);