Skip to content

Commit 2075bf3

Browse files
committed
fix(ui-grid-body): normalize mouse wheel events because browsers suck
1 parent 7933c1a commit 2075bf3

File tree

3 files changed

+72
-6
lines changed

3 files changed

+72
-6
lines changed

Diff for: Gruntfile.js

+4-4
Original file line numberDiff line numberDiff line change
@@ -331,14 +331,14 @@ module.exports = function(grunt) {
331331
'node_modules/marked/lib/marked.js'
332332
],
333333
httpScripts: [
334-
process.env.TRAVIS ? '/release/<%= pkg.name %>.unstable.js' : '/release/<%= pkg.name %>.js'
335-
// '/release/<%= pkg.name %>.js'
334+
// process.env.TRAVIS ? '/release/<%= pkg.name %>.unstable.js' : '/release/<%= pkg.name %>.js'
335+
'/release/<%= pkg.name %>.js'
336336
],
337337
styles: [
338338
'misc/doc/css/prettify.css',
339339
'misc/doc/css/bootstrap-flatly.css',
340-
process.env.TRAVIS ? '<%= dist %>/release/<%= pkg.name %>.unstable.css' : '<%= dist %>/release/<%= pkg.name %>.css'
341-
// '<%= dist %>/release/<%= pkg.name %>.css'
340+
// process.env.TRAVIS ? '<%= dist %>/release/<%= pkg.name %>.unstable.css' : '<%= dist %>/release/<%= pkg.name %>.css'
341+
'<%= dist %>/release/<%= pkg.name %>.css'
342342
],
343343
title: 'UI Grid',
344344
titleLink: 'http://<%= site %>',

Diff for: src/js/directives/ui-grid-body.js

+5-2
Original file line numberDiff line numberDiff line change
@@ -143,13 +143,16 @@ app.directive('uiGridBody', ['$log', 'GridUtil', function($log, GridUtil) {
143143
});
144144

145145
// Scroll the viewport when the mousewheel is used
146-
elm.bind('mousewheel', function(evt) {
146+
elm.bind('wheel mousewheel DomMouseScroll MozMousePixelScroll', function(evt) {
147147
// use wheelDeltaY
148148
evt.preventDefault();
149149

150+
// $log.debug('evt', evt);
150151
// $log.debug('evt.wheelDeltaY', evt.wheelDeltaY);
151152

152-
var scrollAmount = evt.wheelDeltaY * -1;
153+
var newEvent = GridUtil.normalizeWheelEvent(evt);
154+
155+
var scrollAmount = newEvent.deltaY * -120;
153156

154157
// Get the scroll percentage
155158
// var scrollPercentage = (uiGridCtrl.viewport[0].scrollTop + scrollAmount) / (uiGridCtrl.viewport[0].scrollHeight - scope.options.viewportHeight);

Diff for: src/js/services/ui-grid-util.js

+63
Original file line numberDiff line numberDiff line change
@@ -277,6 +277,69 @@ app.service('GridUtil', ['$window', function ($window) {
277277
*/
278278
elementHeight: function (elem) {
279279

280+
},
281+
282+
normalizeWheelEvent: function (event) {
283+
// var toFix = ['wheel', 'mousewheel', 'DOMMouseScroll', 'MozMousePixelScroll'];
284+
// var toBind = 'onwheel' in document || document.documentMode >= 9 ? ['wheel'] : ['mousewheel', 'DomMouseScroll', 'MozMousePixelScroll'];
285+
var lowestDelta, lowestDeltaXY;
286+
287+
var orgEvent = event || window.event,
288+
args = [].slice.call(arguments, 1),
289+
delta = 0,
290+
deltaX = 0,
291+
deltaY = 0,
292+
absDelta = 0,
293+
absDeltaXY = 0,
294+
fn;
295+
296+
// event = $.event.fix(orgEvent);
297+
// event.type = 'mousewheel';
298+
299+
// Old school scrollwheel delta
300+
if ( orgEvent.wheelDelta ) { delta = orgEvent.wheelDelta; }
301+
if ( orgEvent.detail ) { delta = orgEvent.detail * -1; }
302+
303+
// At a minimum, setup the deltaY to be delta
304+
deltaY = delta;
305+
306+
// Firefox < 17 related to DOMMouseScroll event
307+
if ( orgEvent.axis !== undefined && orgEvent.axis === orgEvent.HORIZONTAL_AXIS ) {
308+
deltaY = 0;
309+
deltaX = delta * -1;
310+
}
311+
312+
// New school wheel delta (wheel event)
313+
if ( orgEvent.deltaY ) {
314+
deltaY = orgEvent.deltaY * -1;
315+
delta = deltaY;
316+
}
317+
if ( orgEvent.deltaX ) {
318+
deltaX = orgEvent.deltaX;
319+
delta = deltaX * -1;
320+
}
321+
322+
// Webkit
323+
if ( orgEvent.wheelDeltaY !== undefined ) { deltaY = orgEvent.wheelDeltaY; }
324+
if ( orgEvent.wheelDeltaX !== undefined ) { deltaX = orgEvent.wheelDeltaX * -1; }
325+
326+
// Look for lowest delta to normalize the delta values
327+
absDelta = Math.abs(delta);
328+
if ( !lowestDelta || absDelta < lowestDelta ) { lowestDelta = absDelta; }
329+
absDeltaXY = Math.max(Math.abs(deltaY), Math.abs(deltaX));
330+
if ( !lowestDeltaXY || absDeltaXY < lowestDeltaXY ) { lowestDeltaXY = absDeltaXY; }
331+
332+
// Get a whole value for the deltas
333+
fn = delta > 0 ? 'floor' : 'ceil';
334+
delta = Math[fn](delta / lowestDelta);
335+
deltaX = Math[fn](deltaX / lowestDeltaXY);
336+
deltaY = Math[fn](deltaY / lowestDeltaXY);
337+
338+
return {
339+
delta: delta,
340+
deltaX: deltaX,
341+
deltaY: deltaY
342+
};
280343
}
281344
};
282345

0 commit comments

Comments
 (0)