; (function (factory){ 'use strict'; if (typeof define === 'function' && define.amd) { define(['jquery'] , factory); } else if (typeof module === 'object' && module.exports) { module.exports = factory(require('jquery')); } else if (jQuery && !jQuery.fn.hoverIntent) { factory(jQuery); } } )(function ($){ 'use strict'; var _cfg = { interval: 100, sensitivity: 6, timeout: 0} ; var INSTANCE_COUNT = 0; var cX, cY; var track = function (ev){ cX = ev.pageX; cY = ev.pageY; } ; var compare = function (ev, $el, s, cfg){ if (Math.sqrt((s.pX - cX) * (s.pX - cX) + (s.pY - cY) * (s.pY - cY)) < cfg.sensitivity) { $el.off(s.event, track); delete s.timeoutId; s.isActive = true ; ev.pageX = cX; ev.pageY = cY; delete s.pX; delete s.pY; return cfg.over.apply($el[0], [ev] ); } else { s.pX = cX; s.pY = cY; s.timeoutId = _AN_Call_settimeout('setTimeout', window, function (){ compare(ev, $el, s, cfg); } , cfg.interval); } } ; var delay = function (ev, $el, s, out){ var data = $el.data('hoverIntent'); if (data) { delete data[s.id]; } return out.apply($el[0], [ev] ); } ; var isFunction = function (value){ return typeof value === 'function'; } ; $.fn.hoverIntent = function (handlerIn, handlerOut, selector){ var instanceId = INSTANCE_COUNT++ ; var cfg = $.extend({ } , _cfg); if ($.isPlainObject(handlerIn)) { cfg = $.extend(cfg, handlerIn); if (!isFunction(cfg.out)) { cfg.out = cfg.over; } } else if (isFunction(handlerOut)) { cfg = $.extend(cfg, { over: handlerIn, out: handlerOut, selector: selector} ); } else { cfg = $.extend(cfg, { over: handlerIn, out: handlerIn, selector: handlerOut} ); } var handleHover = function (e){ var ev = $.extend({ } , e); var $el = $(this); var hoverIntentData = $el.data('hoverIntent'); if (!hoverIntentData) { $el.data('hoverIntent', (hoverIntentData = { } )); } var state = hoverIntentData[instanceId]; if (!state) { hoverIntentData[instanceId] = state = { id: instanceId} ; } if (state.timeoutId) { state.timeoutId = clearTimeout(state.timeoutId); } var mousemove = state.event = 'mousemove.hoverIntent.hoverIntent' + instanceId; if (e.type === 'mouseenter') { if (state.isActive) { return ; } state.pX = ev.pageX; state.pY = ev.pageY; $el.off(mousemove, track).on(mousemove, track); state.timeoutId = _AN_Call_settimeout('setTimeout', window, function (){ compare(ev, $el, state, cfg); } , cfg.interval); } else { if (!state.isActive) { return ; } $el.off(mousemove, track); state.timeoutId = _AN_Call_settimeout('setTimeout', window, function (){ delay(ev, $el, state, cfg.out); } , cfg.timeout); } } ; return this.on({ 'mouseenter.hoverIntent': handleHover, 'mouseleave.hoverIntent': handleHover} , cfg.selector); } ; } );