GPQAPP

Форк
0
/
jquery.mousewheel.js 
221 строка · 8.1 Кб
1
/*!
2
 * jQuery Mousewheel 3.1.13
3
 *
4
 * Copyright jQuery Foundation and other contributors
5
 * Released under the MIT license
6
 * http://jquery.org/license
7
 */
8

9
(function (factory) {
10
    if ( typeof define === 'function' && define.amd ) {
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.12',
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
            // Clean up the data we added to the element
59
            $.removeData(this, 'mousewheel-line-height');
60
            $.removeData(this, 'mousewheel-page-height');
61
        },
62

63
        getLineHeight: function(elem) {
64
            var $elem = $(elem),
65
                $parent = $elem['offsetParent' in $.fn ? 'offsetParent' : 'parent']();
66
            if (!$parent.length) {
67
                $parent = $('body');
68
            }
69
            return parseInt($parent.css('fontSize'), 10) || parseInt($elem.css('fontSize'), 10) || 16;
70
        },
71

72
        getPageHeight: function(elem) {
73
            return $(elem).height();
74
        },
75

76
        settings: {
77
            adjustOldDeltas: true, // see shouldAdjustOldDeltas() below
78
            normalizeOffset: true  // calls getBoundingClientRect for each event
79
        }
80
    };
81

82
    $.fn.extend({
83
        mousewheel: function(fn) {
84
            return fn ? this.bind('mousewheel', fn) : this.trigger('mousewheel');
85
        },
86

87
        unmousewheel: function(fn) {
88
            return this.unbind('mousewheel', fn);
89
        }
90
    });
91

92

93
    function handler(event) {
94
        var orgEvent   = event || window.event,
95
            args       = slice.call(arguments, 1),
96
            delta      = 0,
97
            deltaX     = 0,
98
            deltaY     = 0,
99
            absDelta   = 0,
100
            offsetX    = 0,
101
            offsetY    = 0;
102
        event = $.event.fix(orgEvent);
103
        event.type = 'mousewheel';
104

105
        // Old school scrollwheel delta
106
        if ( 'detail'      in orgEvent ) { deltaY = orgEvent.detail * -1;      }
107
        if ( 'wheelDelta'  in orgEvent ) { deltaY = orgEvent.wheelDelta;       }
108
        if ( 'wheelDeltaY' in orgEvent ) { deltaY = orgEvent.wheelDeltaY;      }
109
        if ( 'wheelDeltaX' in orgEvent ) { deltaX = orgEvent.wheelDeltaX * -1; }
110

111
        // Firefox < 17 horizontal scrolling related to DOMMouseScroll event
112
        if ( 'axis' in orgEvent && orgEvent.axis === orgEvent.HORIZONTAL_AXIS ) {
113
            deltaX = deltaY * -1;
114
            deltaY = 0;
115
        }
116

117
        // Set delta to be deltaY or deltaX if deltaY is 0 for backwards compatabilitiy
118
        delta = deltaY === 0 ? deltaX : deltaY;
119

120
        // New school wheel delta (wheel event)
121
        if ( 'deltaY' in orgEvent ) {
122
            deltaY = orgEvent.deltaY * -1;
123
            delta  = deltaY;
124
        }
125
        if ( 'deltaX' in orgEvent ) {
126
            deltaX = orgEvent.deltaX;
127
            if ( deltaY === 0 ) { delta  = deltaX * -1; }
128
        }
129

130
        // No change actually happened, no reason to go any further
131
        if ( deltaY === 0 && deltaX === 0 ) { return; }
132

133
        // Need to convert lines and pages to pixels if we aren't already in pixels
134
        // There are three delta modes:
135
        //   * deltaMode 0 is by pixels, nothing to do
136
        //   * deltaMode 1 is by lines
137
        //   * deltaMode 2 is by pages
138
        if ( orgEvent.deltaMode === 1 ) {
139
            var lineHeight = $.data(this, 'mousewheel-line-height');
140
            delta  *= lineHeight;
141
            deltaY *= lineHeight;
142
            deltaX *= lineHeight;
143
        } else if ( orgEvent.deltaMode === 2 ) {
144
            var pageHeight = $.data(this, 'mousewheel-page-height');
145
            delta  *= pageHeight;
146
            deltaY *= pageHeight;
147
            deltaX *= pageHeight;
148
        }
149

150
        // Store lowest absolute delta to normalize the delta values
151
        absDelta = Math.max( Math.abs(deltaY), Math.abs(deltaX) );
152

153
        if ( !lowestDelta || absDelta < lowestDelta ) {
154
            lowestDelta = absDelta;
155

156
            // Adjust older deltas if necessary
157
            if ( shouldAdjustOldDeltas(orgEvent, absDelta) ) {
158
                lowestDelta /= 40;
159
            }
160
        }
161

162
        // Adjust older deltas if necessary
163
        if ( shouldAdjustOldDeltas(orgEvent, absDelta) ) {
164
            // Divide all the things by 40!
165
            delta  /= 40;
166
            deltaX /= 40;
167
            deltaY /= 40;
168
        }
169

170
        // Get a whole, normalized value for the deltas
171
        delta  = Math[ delta  >= 1 ? 'floor' : 'ceil' ](delta  / lowestDelta);
172
        deltaX = Math[ deltaX >= 1 ? 'floor' : 'ceil' ](deltaX / lowestDelta);
173
        deltaY = Math[ deltaY >= 1 ? 'floor' : 'ceil' ](deltaY / lowestDelta);
174

175
        // Normalise offsetX and offsetY properties
176
        if ( special.settings.normalizeOffset && this.getBoundingClientRect ) {
177
            var boundingRect = this.getBoundingClientRect();
178
            offsetX = event.clientX - boundingRect.left;
179
            offsetY = event.clientY - boundingRect.top;
180
        }
181

182
        // Add information to the event object
183
        event.deltaX = deltaX;
184
        event.deltaY = deltaY;
185
        event.deltaFactor = lowestDelta;
186
        event.offsetX = offsetX;
187
        event.offsetY = offsetY;
188
        // Go ahead and set deltaMode to 0 since we converted to pixels
189
        // Although this is a little odd since we overwrite the deltaX/Y
190
        // properties with normalized deltas.
191
        event.deltaMode = 0;
192

193
        // Add event and delta to the front of the arguments
194
        args.unshift(event, delta, deltaX, deltaY);
195

196
        // Clearout lowestDelta after sometime to better
197
        // handle multiple device types that give different
198
        // a different lowestDelta
199
        // Ex: trackpad = 3 and mouse wheel = 120
200
        if (nullLowestDeltaTimeout) { clearTimeout(nullLowestDeltaTimeout); }
201
        nullLowestDeltaTimeout = setTimeout(nullLowestDelta, 200);
202

203
        return ($.event.dispatch || $.event.handle).apply(this, args);
204
    }
205

206
    function nullLowestDelta() {
207
        lowestDelta = null;
208
    }
209

210
    function shouldAdjustOldDeltas(orgEvent, absDelta) {
211
        // If this is an older event and the delta is divisable by 120,
212
        // then we are assuming that the browser is treating this as an
213
        // older mouse wheel event and that we should divide the deltas
214
        // by 40 to try and get a more usable deltaFactor.
215
        // Side note, this actually impacts the reported scroll distance
216
        // in older browsers and can cause scrolling to be slower than native.
217
        // Turn this off by setting $.event.special.mousewheel.settings.adjustOldDeltas to false.
218
        return special.settings.adjustOldDeltas && orgEvent.type === 'mousewheel' && absDelta % 120 === 0;
219
    }
220

221
}));
222

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.