Issues (54)

docs/js/jquery.mousewheel.js (2 issues)

1
/*! Copyright (c) 2013 Brandon Aaron (http://brandon.aaron.sh)
2
 * Licensed under the MIT License (LICENSE.txt).
3
 *
4
 * Version: 3.1.9
5
 *
6
 * Requires: jQuery 1.2.2+
7
 */
8
9
(function (factory) {
10
    if ( typeof define === 'function' && define.amd ) {
0 ignored issues
show
The variable define seems to be never declared. If this is a global, consider adding a /** global: define */ comment.

This checks looks for references to variables that have not been declared. This is most likey a typographical error or a variable has been renamed.

To learn more about declaring variables in Javascript, see the MDN.

Loading history...
11
        // AMD. Register as an anonymous module.
12
        define(['jquery'], factory);
13
    } else if (typeof exports === 'object') {
14
        // Node/CommonJS style for Browserify
15
        module.exports = factory;
16
    } else {
17
        // Browser globals
18
        factory(jQuery);
19
    }
20
}(function ($) {
21
22
    var toFix  = ['wheel', 'mousewheel', 'DOMMouseScroll', 'MozMousePixelScroll'],
23
        toBind = ( 'onwheel' in document || document.documentMode >= 9 ) ?
24
                    ['wheel'] : ['mousewheel', 'DomMouseScroll', 'MozMousePixelScroll'],
25
        slice  = Array.prototype.slice,
26
        nullLowestDeltaTimeout, lowestDelta;
27
28
    if ( $.event.fixHooks ) {
29
        for ( var i = toFix.length; i; ) {
30
            $.event.fixHooks[ toFix[--i] ] = $.event.mouseHooks;
31
        }
32
    }
33
34
    var special = $.event.special.mousewheel = {
35
        version: '3.1.9',
36
37
        setup: function() {
38
            if ( this.addEventListener ) {
39
                for ( var i = toBind.length; i; ) {
40
                    this.addEventListener( toBind[--i], handler, false );
41
                }
42
            } else {
43
                this.onmousewheel = handler;
44
            }
45
            // Store the line height and page height for this particular element
46
            $.data(this, 'mousewheel-line-height', special.getLineHeight(this));
47
            $.data(this, 'mousewheel-page-height', special.getPageHeight(this));
48
        },
49
50
        teardown: function() {
51
            if ( this.removeEventListener ) {
52
                for ( var i = toBind.length; i; ) {
53
                    this.removeEventListener( toBind[--i], handler, false );
54
                }
55
            } else {
56
                this.onmousewheel = null;
57
            }
58
        },
59
60
        getLineHeight: function(elem) {
61
            return parseInt($(elem)['offsetParent' in $.fn ? 'offsetParent' : 'parent']().css('fontSize'), 10);
62
        },
63
64
        getPageHeight: function(elem) {
65
            return $(elem).height();
66
        },
67
68
        settings: {
69
            adjustOldDeltas: true
70
        }
71
    };
72
73
    $.fn.extend({
74
        mousewheel: function(fn) {
75
            return fn ? this.bind('mousewheel', fn) : this.trigger('mousewheel');
76
        },
77
78
        unmousewheel: function(fn) {
79
            return this.unbind('mousewheel', fn);
80
        }
81
    });
82
83
84
    function handler(event) {
85
        var orgEvent   = event || window.event,
86
            args       = slice.call(arguments, 1),
87
            delta      = 0,
88
            deltaX     = 0,
89
            deltaY     = 0,
90
            absDelta   = 0;
91
        event = $.event.fix(orgEvent);
92
        event.type = 'mousewheel';
93
94
        // Old school scrollwheel delta
95
        if ( 'detail'      in orgEvent ) { deltaY = orgEvent.detail * -1;      }
96
        if ( 'wheelDelta'  in orgEvent ) { deltaY = orgEvent.wheelDelta;       }
97
        if ( 'wheelDeltaY' in orgEvent ) { deltaY = orgEvent.wheelDeltaY;      }
98
        if ( 'wheelDeltaX' in orgEvent ) { deltaX = orgEvent.wheelDeltaX * -1; }
99
100
        // Firefox < 17 horizontal scrolling related to DOMMouseScroll event
101
        if ( 'axis' in orgEvent && orgEvent.axis === orgEvent.HORIZONTAL_AXIS ) {
102
            deltaX = deltaY * -1;
103
            deltaY = 0;
104
        }
105
106
        // Set delta to be deltaY or deltaX if deltaY is 0 for backwards compatabilitiy
107
        delta = deltaY === 0 ? deltaX : deltaY;
108
109
        // New school wheel delta (wheel event)
110
        if ( 'deltaY' in orgEvent ) {
111
            deltaY = orgEvent.deltaY * -1;
112
            delta  = deltaY;
113
        }
114
        if ( 'deltaX' in orgEvent ) {
115
            deltaX = orgEvent.deltaX;
116
            if ( deltaY === 0 ) { delta  = deltaX * -1; }
117
        }
118
119
        // No change actually happened, no reason to go any further
120
        if ( deltaY === 0 && deltaX === 0 ) { return; }
0 ignored issues
show
Comprehensibility Best Practice introduced by
Are you sure this return statement is not missing an argument? If this is intended, consider adding an explicit undefined like return undefined;.
Loading history...
121
122
        // Need to convert lines and pages to pixels if we aren't already in pixels
123
        // There are three delta modes:
124
        //   * deltaMode 0 is by pixels, nothing to do
125
        //   * deltaMode 1 is by lines
126
        //   * deltaMode 2 is by pages
127
        if ( orgEvent.deltaMode === 1 ) {
128
            var lineHeight = $.data(this, 'mousewheel-line-height');
129
            delta  *= lineHeight;
130
            deltaY *= lineHeight;
131
            deltaX *= lineHeight;
132
        } else if ( orgEvent.deltaMode === 2 ) {
133
            var pageHeight = $.data(this, 'mousewheel-page-height');
134
            delta  *= pageHeight;
135
            deltaY *= pageHeight;
136
            deltaX *= pageHeight;
137
        }
138
139
        // Store lowest absolute delta to normalize the delta values
140
        absDelta = Math.max( Math.abs(deltaY), Math.abs(deltaX) );
141
142
        if ( !lowestDelta || absDelta < lowestDelta ) {
143
            lowestDelta = absDelta;
144
145
            // Adjust older deltas if necessary
146
            if ( shouldAdjustOldDeltas(orgEvent, absDelta) ) {
147
                lowestDelta /= 40;
148
            }
149
        }
150
151
        // Adjust older deltas if necessary
152
        if ( shouldAdjustOldDeltas(orgEvent, absDelta) ) {
153
            // Divide all the things by 40!
154
            delta  /= 40;
155
            deltaX /= 40;
156
            deltaY /= 40;
157
        }
158
159
        // Get a whole, normalized value for the deltas
160
        delta  = Math[ delta  >= 1 ? 'floor' : 'ceil' ](delta  / lowestDelta);
161
        deltaX = Math[ deltaX >= 1 ? 'floor' : 'ceil' ](deltaX / lowestDelta);
162
        deltaY = Math[ deltaY >= 1 ? 'floor' : 'ceil' ](deltaY / lowestDelta);
163
164
        // Add information to the event object
165
        event.deltaX = deltaX;
166
        event.deltaY = deltaY;
167
        event.deltaFactor = lowestDelta;
168
        // Go ahead and set deltaMode to 0 since we converted to pixels
169
        // Although this is a little odd since we overwrite the deltaX/Y
170
        // properties with normalized deltas.
171
        event.deltaMode = 0;
172
173
        // Add event and delta to the front of the arguments
174
        args.unshift(event, delta, deltaX, deltaY);
175
176
        // Clearout lowestDelta after sometime to better
177
        // handle multiple device types that give different
178
        // a different lowestDelta
179
        // Ex: trackpad = 3 and mouse wheel = 120
180
        if (nullLowestDeltaTimeout) { clearTimeout(nullLowestDeltaTimeout); }
181
        nullLowestDeltaTimeout = setTimeout(nullLowestDelta, 200);
182
183
        return ($.event.dispatch || $.event.handle).apply(this, args);
184
    }
185
186
    function nullLowestDelta() {
187
        lowestDelta = null;
188
    }
189
190
    function shouldAdjustOldDeltas(orgEvent, absDelta) {
191
        // If this is an older event and the delta is divisable by 120,
192
        // then we are assuming that the browser is treating this as an
193
        // older mouse wheel event and that we should divide the deltas
194
        // by 40 to try and get a more usable deltaFactor.
195
        // Side note, this actually impacts the reported scroll distance
196
        // in older browsers and can cause scrolling to be slower than native.
197
        // Turn this off by setting $.event.special.mousewheel.settings.adjustOldDeltas to false.
198
        return special.settings.adjustOldDeltas && orgEvent.type === 'mousewheel' && absDelta % 120 === 0;
199
    }
200
201
}));
202