1 /**
  2  * @fileOverview normalize mousewheel in gecko
  3  * @author yiminghe@gmail.com
  4  */
  5 KISSY.add("event/mousewheel", function (S, Event, UA, Utils, EventObject, handle, _data, special) {
  6 
  7     var MOUSE_WHEEL = UA.gecko ? 'DOMMouseScroll' : 'mousewheel',
  8         simpleRemove = Utils.simpleRemove,
  9         simpleAdd = Utils.simpleAdd,
 10         MOUSE_WHEEL_HANDLER = "mousewheelHandler";
 11 
 12     function handler(e) {
 13         var deltaX,
 14             currentTarget = this,
 15             deltaY,
 16             delta,
 17             detail = e.detail;
 18 
 19         if (e.wheelDelta) {
 20             delta = e.wheelDelta / 120;
 21         }
 22         if (e.detail) {
 23             // press control e.detail == 1 else e.detail == 3
 24             delta = -(detail % 3 == 0 ? detail / 3 : detail);
 25         }
 26 
 27         // Gecko
 28         if (e.axis !== undefined) {
 29             if (e.axis === e['HORIZONTAL_AXIS']) {
 30                 deltaY = 0;
 31                 deltaX = -1 * delta;
 32             } else if (e.axis === e['VERTICAL_AXIS']) {
 33                 deltaX = 0;
 34                 deltaY = delta;
 35             }
 36         }
 37 
 38         // Webkit
 39         if (e['wheelDeltaY'] !== undefined) {
 40             deltaY = e['wheelDeltaY'] / 120;
 41         }
 42         if (e['wheelDeltaX'] !== undefined) {
 43             deltaX = -1 * e['wheelDeltaX'] / 120;
 44         }
 45 
 46         // 默认 deltaY ( ie )
 47         if (!deltaX && !deltaY) {
 48             deltaY = delta;
 49         }
 50 
 51         // can not invoke eventDesc.handler , it will protect type
 52         // but here in firefox , we want to change type really
 53         e = new EventObject(currentTarget, e);
 54 
 55         S.mix(e, {
 56             deltaY:deltaY,
 57             delta:delta,
 58             deltaX:deltaX,
 59             type:'mousewheel'
 60         });
 61 
 62         return  handle(currentTarget, e);
 63     }
 64 
 65     special['mousewheel'] = {
 66         setup:function () {
 67             var el = this,
 68                 mousewheelHandler,
 69                 eventDesc = _data._data(el);
 70             // solve this in ie
 71             mousewheelHandler = eventDesc[MOUSE_WHEEL_HANDLER] = S.bind(handler, el);
 72             simpleAdd(this, MOUSE_WHEEL, mousewheelHandler);
 73         },
 74         tearDown:function () {
 75             var el = this,
 76                 mousewheelHandler,
 77                 eventDesc = _data._data(el);
 78             mousewheelHandler = eventDesc[MOUSE_WHEEL_HANDLER];
 79             simpleRemove(this, MOUSE_WHEEL, mousewheelHandler);
 80             delete eventDesc[mousewheelHandler];
 81         }
 82     };
 83 
 84 }, {
 85     requires:['./base', 'ua', './utils',
 86         './object', './handle',
 87         './data', "./special"]
 88 });
 89 
 90 /**
 91  note:
 92  not perfect in osx : accelerated scroll
 93  refer:
 94  https://github.com/brandonaaron/jquery-mousewheel/blob/master/jquery.mousewheel.js
 95  http://www.planabc.net/2010/08/12/mousewheel_event_in_javascript/
 96  http://www.switchonthecode.com/tutorials/javascript-tutorial-the-scroll-wheel
 97  http://stackoverflow.com/questions/5527601/normalizing-mousewheel-speed-across-browsers/5542105#5542105
 98  http://www.javascriptkit.com/javatutors/onmousewheel.shtml
 99  http://www.adomas.org/javascript-mouse-wheel/
100  http://plugins.jquery.com/project/mousewheel
101  http://www.cnblogs.com/aiyuchen/archive/2011/04/19/2020843.html
102  http://www.w3.org/TR/DOM-Level-3-Events/#events-mousewheelevents
103  **/