jquery.mousewheel.js 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. /*! Copyright (c) 2013 Brandon Aaron (http://brandon.aaron.sh)
  2. * Licensed under the MIT License (LICENSE.txt).
  3. *
  4. * Version: 3.1.6
  5. *
  6. * Requires: jQuery 1.2.2+
  7. */
  8. (function (factory) {
  9. if ( typeof define === 'function' && define.amd ) {
  10. // AMD. Register as an anonymous module.
  11. define(['jquery'], factory);
  12. } else if (typeof exports === 'object') {
  13. // Node/CommonJS style for Browserify
  14. module.exports = factory;
  15. } else {
  16. // Browser globals
  17. factory(jQuery);
  18. }
  19. }(function ($) {
  20. var toFix = ['wheel', 'mousewheel', 'DOMMouseScroll', 'MozMousePixelScroll'],
  21. toBind = ( 'onwheel' in document || document.documentMode >= 9 ) ?
  22. ['wheel'] : ['mousewheel', 'DomMouseScroll', 'MozMousePixelScroll'],
  23. slice = Array.prototype.slice,
  24. nullLowestDeltaTimeout, lowestDelta;
  25. if ( $.event.fixHooks ) {
  26. for ( var i = toFix.length; i; ) {
  27. $.event.fixHooks[ toFix[--i] ] = $.event.mouseHooks;
  28. }
  29. }
  30. $.event.special.mousewheel = {
  31. version: '3.1.6',
  32. setup: function() {
  33. if ( this.addEventListener ) {
  34. for ( var i = toBind.length; i; ) {
  35. this.addEventListener( toBind[--i], handler, false );
  36. }
  37. } else {
  38. this.onmousewheel = handler;
  39. }
  40. },
  41. teardown: function() {
  42. if ( this.removeEventListener ) {
  43. for ( var i = toBind.length; i; ) {
  44. this.removeEventListener( toBind[--i], handler, false );
  45. }
  46. } else {
  47. this.onmousewheel = null;
  48. }
  49. }
  50. };
  51. $.fn.extend({
  52. mousewheel: function(fn) {
  53. return fn ? this.bind('mousewheel', fn) : this.trigger('mousewheel');
  54. },
  55. unmousewheel: function(fn) {
  56. return this.unbind('mousewheel', fn);
  57. }
  58. });
  59. function handler(event) {
  60. var orgEvent = event || window.event,
  61. args = slice.call(arguments, 1),
  62. delta = 0,
  63. deltaX = 0,
  64. deltaY = 0,
  65. absDelta = 0;
  66. event = $.event.fix(orgEvent);
  67. event.type = 'mousewheel';
  68. // Old school scrollwheel delta
  69. if ( 'detail' in orgEvent ) { deltaY = orgEvent.detail * -1; }
  70. if ( 'wheelDelta' in orgEvent ) { deltaY = orgEvent.wheelDelta; }
  71. if ( 'wheelDeltaY' in orgEvent ) { deltaY = orgEvent.wheelDeltaY; }
  72. if ( 'wheelDeltaX' in orgEvent ) { deltaX = orgEvent.wheelDeltaX * -1; }
  73. // Firefox < 17 horizontal scrolling related to DOMMouseScroll event
  74. if ( 'axis' in orgEvent && orgEvent.axis === orgEvent.HORIZONTAL_AXIS ) {
  75. deltaX = deltaY * -1;
  76. deltaY = 0;
  77. }
  78. // Set delta to be deltaY or deltaX if deltaY is 0 for backwards compatabilitiy
  79. delta = deltaY === 0 ? deltaX : deltaY;
  80. // New school wheel delta (wheel event)
  81. if ( 'deltaY' in orgEvent ) {
  82. deltaY = orgEvent.deltaY * -1;
  83. delta = deltaY;
  84. }
  85. if ( 'deltaX' in orgEvent ) {
  86. deltaX = orgEvent.deltaX;
  87. if ( deltaY === 0 ) { delta = deltaX * -1; }
  88. }
  89. // No change actually happened, no reason to go any further
  90. if ( deltaY === 0 && deltaX === 0 ) { return; }
  91. // Store lowest absolute delta to normalize the delta values
  92. absDelta = Math.max( Math.abs(deltaY), Math.abs(deltaX) );
  93. if ( !lowestDelta || absDelta < lowestDelta ) {
  94. lowestDelta = absDelta;
  95. }
  96. // Get a whole, normalized value for the deltas
  97. delta = Math[ delta >= 1 ? 'floor' : 'ceil' ](delta / lowestDelta);
  98. deltaX = Math[ deltaX >= 1 ? 'floor' : 'ceil' ](deltaX / lowestDelta);
  99. deltaY = Math[ deltaY >= 1 ? 'floor' : 'ceil' ](deltaY / lowestDelta);
  100. // Add information to the event object
  101. event.deltaX = deltaX;
  102. event.deltaY = deltaY;
  103. event.deltaFactor = lowestDelta;
  104. // Add event and delta to the front of the arguments
  105. args.unshift(event, delta, deltaX, deltaY);
  106. // Clearout lowestDelta after sometime to better
  107. // handle multiple device types that give different
  108. // a different lowestDelta
  109. // Ex: trackpad = 3 and mouse wheel = 120
  110. if (nullLowestDeltaTimeout) { clearTimeout(nullLowestDeltaTimeout); }
  111. nullLowestDeltaTimeout = setTimeout(nullLowestDelta, 200);
  112. return ($.event.dispatch || $.event.handle).apply(this, args);
  113. }
  114. function nullLowestDelta() {
  115. lowestDelta = null;
  116. }
  117. }));