(function (factory) { if ( typeof define === 'function' && define.amd ) { define(['jquery'], factory); } else if (typeof exports === 'object') { module.exports = factory; } else { factory(jquery); } }(function ($) { var tofix = ['wheel', 'mousewheel', 'dommousescroll', 'mozmousepixelscroll'], tobind = ( 'onwheel' in document || document.documentmode >= 9 ) ? ['wheel'] : ['mousewheel', 'dommousescroll', 'mozmousepixelscroll'], slice = array.prototype.slice, nulllowestdeltatimeout, lowestdelta; if ( $.event.fixhooks ) { for ( var i = tofix.length; i; ) { $.event.fixhooks[ tofix[--i] ] = $.event.mousehooks; } } var special = $.event.special.mousewheel = { version: '3.1.9', setup: function() { if ( this.addeventlistener ) { for ( var i = tobind.length; i; ) { this.addeventlistener( tobind[--i], handler, false ); } } else { this.onmousewheel = handler; } $.data(this, 'mousewheel-line-height', special.getlineheight(this)); $.data(this, 'mousewheel-page-height', special.getpageheight(this)); }, teardown: function() { if ( this.removeeventlistener ) { for ( var i = tobind.length; i; ) { this.removeeventlistener( tobind[--i], handler, false ); } } else { this.onmousewheel = null; } }, getlineheight: function(elem) { return parseint($(elem)['offsetparent' in $.fn ? 'offsetparent' : 'parent']().css('fontsize'), 10); }, getpageheight: function(elem) { return $(elem).height(); }, settings: { adjustolddeltas: true } }; $.fn.extend({ mousewheel: function(fn) { return fn ? this.bind('mousewheel', fn) : this.trigger('mousewheel'); }, unmousewheel: function(fn) { return this.unbind('mousewheel', fn); } }); function handler(event) { var orgevent = event || window.event, args = slice.call(arguments, 1), delta = 0, deltax = 0, deltay = 0, absdelta = 0; event = $.event.fix(orgevent); event.type = 'mousewheel'; if ( 'detail' in orgevent ) { deltay = orgevent.detail * -1; } if ( 'wheeldelta' in orgevent ) { deltay = orgevent.wheeldelta; } if ( 'wheeldeltay' in orgevent ) { deltay = orgevent.wheeldeltay; } if ( 'wheeldeltax' in orgevent ) { deltax = orgevent.wheeldeltax * -1; } if ( 'axis' in orgevent && orgevent.axis === orgevent.horizontal_axis ) { deltax = deltay * -1; deltay = 0; } delta = deltay === 0 ? deltax : deltay; if ( 'deltay' in orgevent ) { deltay = orgevent.deltay * -1; delta = deltay; } if ( 'deltax' in orgevent ) { deltax = orgevent.deltax; if ( deltay === 0 ) { delta = deltax * -1; } } if ( deltay === 0 && deltax === 0 ) { return; } if ( orgevent.deltamode === 1 ) { var lineheight = $.data(this, 'mousewheel-line-height'); delta *= lineheight; deltay *= lineheight; deltax *= lineheight; } else if ( orgevent.deltamode === 2 ) { var pageheight = $.data(this, 'mousewheel-page-height'); delta *= pageheight; deltay *= pageheight; deltax *= pageheight; } // store lowest absolute delta to normalize the delta values absdelta = math.max( math.abs(deltay), math.abs(deltax) ); if ( !lowestdelta || absdelta < lowestdelta ) { lowestdelta = absdelta; // adjust older deltas if necessary if ( shouldadjustolddeltas(orgevent, absdelta) ) { lowestdelta /= 40; } } // adjust older deltas if necessary if ( shouldadjustolddeltas(orgevent, absdelta) ) { // divide all the things by 40! delta /= 40; deltax /= 40; deltay /= 40; } // get a whole, normalized value for the deltas delta = math[ delta >= 1 ? 'floor' : 'ceil' ](delta / lowestdelta); deltax = math[ deltax >= 1 ? 'floor' : 'ceil' ](deltax / lowestdelta); deltay = math[ deltay >= 1 ? 'floor' : 'ceil' ](deltay / lowestdelta); // add information to the event object event.deltax = deltax; event.deltay = deltay; event.deltafactor = lowestdelta; event.deltamode = 0; args.unshift(event, delta, deltax, deltay); if (nulllowestdeltatimeout) { cleartimeout(nulllowestdeltatimeout); } nulllowestdeltatimeout = settimeout(nulllowestdelta, 200); return ($.event.dispatch || $.event.handle).apply(this, args); } function nulllowestdelta() { lowestdelta = null; } function shouldadjustolddeltas(orgevent, absdelta) { return special.settings.adjustolddeltas && orgevent.type === 'mousewheel' && absdelta % 120 === 0; } }));