From 5aaaf69c5a247a2d69820f5a54f1654833da5342 Mon Sep 17 00:00:00 2001 From: Brandon Aaron Date: Thu, 12 Dec 2013 14:31:33 -0500 Subject: [PATCH] Better handle deltaModes 1 (scroll by lines) and 2 (scroll by pages). --- ChangeLog.md | 4 ++++ bower.json | 2 +- jquery.mousewheel.js | 37 +++++++++++++++++++++++++++++++++++-- mousewheel.jquery.json | 2 +- package.json | 2 +- 5 files changed, 42 insertions(+), 5 deletions(-) diff --git a/ChangeLog.md b/ChangeLog.md index 009cea29b..fabdfe8cf 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -1,5 +1,9 @@ # Mouse Wheel ChangeLog +## 3.1.7-pre + +* Better handle the `deltaMode` values 1 (lines) and 2 (pages) + ## 3.1.6 * Deprecating `delta`, `deltaX`, and `deltaY` event handler arguments diff --git a/bower.json b/bower.json index 9acd327c8..1bf360728 100644 --- a/bower.json +++ b/bower.json @@ -1,6 +1,6 @@ { "name": "jquery-mousewheel", - "version": "3.1.6", + "version": "3.1.7-pre", "main": "./jquery.mousewheel.js", "ignore": [ "*.json", diff --git a/jquery.mousewheel.js b/jquery.mousewheel.js index 920f2299c..a28a661f4 100755 --- a/jquery.mousewheel.js +++ b/jquery.mousewheel.js @@ -1,7 +1,7 @@ /*! Copyright (c) 2013 Brandon Aaron (http://brandon.aaron.sh) * Licensed under the MIT License (LICENSE.txt). * - * Version: 3.1.6 + * Version: 3.1.7-pre * * Requires: jQuery 1.2.2+ */ @@ -31,7 +31,7 @@ } } - $.event.special.mousewheel = { + var special = $.event.special.mousewheel = { version: '3.1.6', setup: function() { @@ -42,6 +42,9 @@ } else { this.onmousewheel = handler; } + // Store the line height and page height for this particular element + $.data(this, 'mousewheel-line-height', special.getLineHeight(this)); + $.data(this, 'mousewheel-page-height', special.getPageHeight(this)); }, teardown: function() { @@ -52,6 +55,14 @@ } else { this.onmousewheel = null; } + }, + + getLineHeight: function(elem) { + return parseInt($(elem).offsetParent().css('fontSize'), 10); + }, + + getPageHeight: function(elem) { + return $(elem).height(); } }; @@ -104,8 +115,26 @@ // No change actually happened, no reason to go any further if ( deltaY === 0 && deltaX === 0 ) { return; } + // Need to convert lines and pages to pixels if we aren't already in pixels + // There are three delta modes: + // * deltaMode 0 is by pixels, nothing to do + // * deltaMode 1 is by lines + // * deltaMode 2 is by pages + 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; } @@ -119,6 +148,10 @@ event.deltaX = deltaX; event.deltaY = deltaY; event.deltaFactor = lowestDelta; + // Go ahead and set deltaMode to 0 since we converted to pixels + // Although this is a little odd since we overwrite the deltaX/Y + // properties with normalized deltas. + event.deltaMode = 0; // Add event and delta to the front of the arguments args.unshift(event, delta, deltaX, deltaY); diff --git a/mousewheel.jquery.json b/mousewheel.jquery.json index ce4064c34..e8790b6b0 100644 --- a/mousewheel.jquery.json +++ b/mousewheel.jquery.json @@ -7,7 +7,7 @@ "mouse", "event" ], - "version": "3.1.6", + "version": "3.1.7-pre", "author": { "name": "Brandon Aaron", "url": "http://brandonaaron.net" diff --git a/package.json b/package.json index ffb01ddab..f88cc0e52 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "jquery-mousewheel", - "version": "3.1.6", + "version": "3.1.7-pre", "author": "Brandon Aaron (http://brandonaaron.net/)", "description": "A jQuery plugin that adds cross-browser mouse wheel support.", "license": "MIT",