|
1 /* Copyright (c) 2011 Brandon Aaron (http://brandonaaron.net) |
|
2 * Licensed under the MIT License (LICENSE.txt). |
|
3 * |
|
4 * Thanks to: Andrew Cobby (@andrewcobby http://github.com/cobbweb) |
|
5 * - Refactored for jQuery 1.7+ only |
|
6 * - Use MozMousePixelScroll for new Gecko browsers |
|
7 * Thanks to: http://adomas.org/javascript-mouse-wheel/ for some pointers. |
|
8 * Thanks to: Mathias Bank(http://www.mathias-bank.de) for a scope bug fix. |
|
9 * Thanks to: Seamus Leahy for adding deltaX and deltaY |
|
10 * |
|
11 * Version: 2.0.0 |
|
12 * |
|
13 * Recommended for jQuery 1.7+ |
|
14 * Should work with older versions though |
|
15 */ |
|
16 |
|
17 (function($,undefined) { |
|
18 |
|
19 var types = ['DOMMouseScroll', 'mousewheel', 'MozMousePixelScroll']; |
|
20 |
|
21 if ($.event.fixHooks) { |
|
22 for (var i=types.length; i;) { |
|
23 $.event.fixHooks[types[--i]] = $.event.mouseHooks; |
|
24 } |
|
25 } |
|
26 |
|
27 $.event.special.mousewheel = { |
|
28 setup: function() { |
|
29 if (this.addEventListener) { |
|
30 for (var i=types.length; i;) { |
|
31 this.addEventListener(types[--i], handler, false); |
|
32 } |
|
33 } else { |
|
34 this.onmousewheel = handler; |
|
35 } |
|
36 }, |
|
37 |
|
38 teardown: function() { |
|
39 if (this.removeEventListener) { |
|
40 for (var i=types.length; i;) { |
|
41 this.removeEventListener(types[--i], handler, false); |
|
42 } |
|
43 } else { |
|
44 this.onmousewheel = null; |
|
45 } |
|
46 } |
|
47 }; |
|
48 |
|
49 function handler(event) { |
|
50 var orgEvent = event || window.event, args = [].slice.call(arguments, 1), delta = 0, deltaX = 0, deltaY = 0; |
|
51 event = $.event.fix(orgEvent); |
|
52 event.type = "mousewheel"; |
|
53 |
|
54 // Old school scrollwheel delta |
|
55 if (orgEvent.wheelDelta) { |
|
56 delta = orgEvent.wheelDelta / 120; |
|
57 } |
|
58 |
|
59 if (orgEvent.detail) { |
|
60 if (orgEvent.type == types[2]) { |
|
61 // Firefox 4+, unbind old DOMMouseScroll event |
|
62 this.removeEventListener(types[0], handler, false); |
|
63 delta = -orgEvent.detail / 42; |
|
64 } else { |
|
65 delta = -orgEvent.detail / 3; |
|
66 } |
|
67 } |
|
68 |
|
69 // New school multidimensional scroll (touchpads) deltas |
|
70 deltaY = delta; |
|
71 |
|
72 // Gecko |
|
73 if (orgEvent.axis !== undefined && orgEvent.axis === orgEvent.HORIZONTAL_AXIS) { |
|
74 deltaY = 0; |
|
75 deltaX = -1 * delta; |
|
76 } |
|
77 |
|
78 // Webkit |
|
79 if (orgEvent.wheelDeltaY !== undefined) { |
|
80 deltaY = orgEvent.wheelDeltaY / 120; |
|
81 } |
|
82 |
|
83 if (orgEvent.wheelDeltaX !== undefined) { |
|
84 deltaX = -1 * orgEvent.wheelDeltaX / 120; |
|
85 } |
|
86 |
|
87 // Add event and delta to the front of the arguments |
|
88 args.unshift(event, delta, deltaX, deltaY); |
|
89 |
|
90 return ($.event.dispatch || $.event.handle).apply(this, args); |
|
91 } |
|
92 |
|
93 })(jQuery); |