diff --git a/ChangeLog.markdown b/ChangeLog.markdown index acb1f8710e..c7185d1137 100644 --- a/ChangeLog.markdown +++ b/ChangeLog.markdown @@ -1,13 +1,23 @@ # Mouse Wheel ChangeLog +# 3.1.0 + +* Fix Firefox 17+ issues by using new wheel event +* Normalize delta values +* Adds horizontal support for IE 9+ by using new wheel event +* Support AMD loaders + + # 3.0.6 * Fix issue with delta being 0 in Firefox + # 3.0.5 * jQuery 1.7 compatibility + # 3.0.4 * Fix IE issue diff --git a/README.markdown b/README.markdown index 9efc3c754f..453ed67015 100644 --- a/README.markdown +++ b/README.markdown @@ -2,7 +2,7 @@ A jQuery plugin that adds cross-browser mouse wheel support. -In order to use the plugin, simply bind the "mousewheel" event to an element. It also provides two helper methods called `mousewheel` and `unmousewheel` that act just like other event helper methods in jQuery. The event callback receives three extra arguments which are the normalized "deltas" of the mouse wheel. +In order to use the plugin, simply bind the "mousewheel" event to an element. It also provides two helper methods called `mousewheel` and `unmousewheel` that act just like other event helper methods in jQuery. The event callback receives three extra arguments which are the normalized "deltas" of the mouse wheel. Here is an example of using both the bind and helper method syntax. @@ -10,7 +10,7 @@ Here is an example of using both the bind and helper method syntax. $('#my_elem').bind('mousewheel', function(event, delta, deltaX, deltaY) { console.log(delta, deltaX, deltaY); }); - + // using the event helper $('#my_elem').mousewheel(function(event, delta, deltaX, deltaY) { console.log(delta, deltaX, deltaY); @@ -21,4 +21,4 @@ Here is an example of using both the bind and helper method syntax. This plugin is licensed under the MIT License (LICENSE.txt). -Copyright (c) 2011 [Brandon Aaron](http://brandonaaron.net) +Copyright (c) 2013 [Brandon Aaron](http://brandonaaron.net) diff --git a/jquery.mousewheel.js b/jquery.mousewheel.js index 38b60951b2..8c603041b9 100755 --- a/jquery.mousewheel.js +++ b/jquery.mousewheel.js @@ -1,84 +1,101 @@ -/*! Copyright (c) 2011 Brandon Aaron (http://brandonaaron.net) +/*! Copyright (c) 2013 Brandon Aaron (http://brandonaaron.net) * Licensed under the MIT License (LICENSE.txt). * * Thanks to: http://adomas.org/javascript-mouse-wheel/ for some pointers. * Thanks to: Mathias Bank(http://www.mathias-bank.de) for a scope bug fix. * Thanks to: Seamus Leahy for adding deltaX and deltaY * - * Version: 3.0.6 - * + * Version: 3.1.0 + * * Requires: 1.2.2+ */ -(function($) { - -var types = ['DOMMouseScroll', 'mousewheel']; - -if ($.event.fixHooks) { - for ( var i=types.length; i; ) { - $.event.fixHooks[ types[--i] ] = $.event.mouseHooks; +(function (factory) { + if (typeof define === 'function' && define.amd) { + // AMD. Register as an anonymous module. + define(['jquery'], factory); + } else { + // Browser globals + factory(jQuery); } -} +}(function ($) { -$.event.special.mousewheel = { - setup: function() { - if ( this.addEventListener ) { - for ( var i=types.length; i; ) { - this.addEventListener( types[--i], handler, false ); - } - } else { - this.onmousewheel = handler; - } - }, - - teardown: function() { - if ( this.removeEventListener ) { - for ( var i=types.length; i; ) { - this.removeEventListener( types[--i], handler, false ); - } - } else { - this.onmousewheel = null; + var toFix = ['wheel', 'mousewheel', 'DOMMouseScroll']; + var toBind = 'onwheel' in document || document.documentMode >= 9 ? ['wheel'] : ['mousewheel', 'DomMouseScroll', 'MozMousePixelScroll']; + var lowestDelta, lowestDeltaXY; + + if ($.event.fixHooks) { + for ( var i=toFix.length; i; ) { + $.event.fixHooks[ toFix[--i] ] = $.event.mouseHooks; } } -}; -$.fn.extend({ - mousewheel: function(fn) { - return fn ? this.bind("mousewheel", fn) : this.trigger("mousewheel"); - }, - - unmousewheel: function(fn) { - return this.unbind("mousewheel", fn); + $.event.special.mousewheel = { + setup: function() { + if ( this.addEventListener ) { + for ( var i=toBind.length; i; ) { + this.addEventListener( toBind[--i], handler, false ); + } + } else { + this.onmousewheel = handler; + } + }, + + teardown: function() { + if ( this.removeEventListener ) { + for ( var i=toBind.length; i; ) { + this.removeEventListener( toBind[--i], handler, false ); + } + } else { + this.onmousewheel = null; + } + } + }; + + $.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, absDeltaXY = 0; + event = $.event.fix(orgEvent); + event.type = "mousewheel"; + + // Old school scrollwheel delta + if ( orgEvent.wheelDelta ) { delta = orgEvent.wheelDelta; } + if ( orgEvent.detail ) { delta = orgEvent.detail * -1; } + + // New school wheel delta (wheel event) + if ( orgEvent.deltaY ) { + deltaY = orgEvent.deltaY * -1; + delta = deltaY; + } + if ( orgEvent.deltaX ) { + deltaX = orgEvent.deltaX; + delta = deltaX * -1; + } + + // Webkit + if ( orgEvent.wheelDeltaY !== undefined ) { deltaY = orgEvent.wheelDeltaY; } + if ( orgEvent.wheelDeltaX !== undefined ) { deltaX = orgEvent.wheelDeltaX * -1; } + + absDelta = Math.abs(delta); + if ( !lowestDelta || absDelta < lowestDelta ) { lowestDelta = absDelta; } + + absDeltaXY = Math.max( Math.abs(deltaY), Math.abs(deltaX) ); + if ( !lowestDeltaXY || absDeltaXY < lowestDeltaXY ) { lowestDeltaXY = absDeltaXY; } + + // Add event and delta to the front of the arguments + args.unshift(event, Math.floor(delta/lowestDelta), Math.floor(deltaX/lowestDeltaXY), Math.floor(deltaY/lowestDeltaXY)); + + return ($.event.dispatch || $.event.handle).apply(this, args); } -}); - -function handler(event) { - var orgEvent = event || window.event, args = [].slice.call( arguments, 1 ), delta = 0, returnValue = true, deltaX = 0, deltaY = 0; - event = $.event.fix(orgEvent); - event.type = "mousewheel"; - - // Old school scrollwheel delta - if ( orgEvent.wheelDelta ) { delta = orgEvent.wheelDelta/120; } - if ( orgEvent.detail ) { delta = -orgEvent.detail/3; } - - // New school multidimensional scroll (touchpads) deltas - deltaY = delta; - - // Gecko - if ( orgEvent.axis !== undefined && orgEvent.axis === orgEvent.HORIZONTAL_AXIS ) { - deltaY = 0; - deltaX = -1*delta; - } - - // Webkit - if ( orgEvent.wheelDeltaY !== undefined ) { deltaY = orgEvent.wheelDeltaY/120; } - if ( orgEvent.wheelDeltaX !== undefined ) { deltaX = -1*orgEvent.wheelDeltaX/120; } - - // Add event and delta to the front of the arguments - args.unshift(event, delta, deltaX, deltaY); - - return ($.event.dispatch || $.event.handle).apply(this, args); -} - -})(jQuery); +})); diff --git a/mousewheel.jquery.json b/mousewheel.jquery.json new file mode 100644 index 0000000000..4b52f1d7b2 --- /dev/null +++ b/mousewheel.jquery.json @@ -0,0 +1,27 @@ +{ + "name": "mousewheel", + "title": "jQuery Mousewheel", + "description": "A jQuery plugin that adds cross-browser mouse wheel support.", + "keywords": [ + "mousewheel", + "mouse", + "event" + ], + "version": "3.1.0", + "author": { + "name": "Brandon Aaron", + "url": "http://brandonaaron.net" + }, + "licenses": [ + { + "type": "MIT", + "url": "https://raw.github.com/brandonaaron/jquery-mousewheel/master/LICENSE.txt" + } + ], + "bugs": "https://github.com/brandonaaron/jquery-mousewheel/issues", + "homepage": "https://github.com/brandonaaron/jquery-mousewheel", + "download": "https://github.com/brandonaaron/jquery-mousewheel/tags", + "dependencies": { + "jquery": ">=1.2.2" + } +}