监听和移除鼠标滚动兼容写法

68 篇文章 0 订阅
// creates a global "addWheelListener" method
// example: addWheelListener( elem, function( e ) { console.log( e.deltaY ); e.preventDefault(); } );
(function(window, document) {
  var prefix = '';
  var _addEventListener;
  var _removeEventListener;
  // var onwheel;
  var support;

  // detect event model
  if (window.addEventListener) {
    _addEventListener = 'addEventListener';
    _removeEventListener = 'removeEventListener';
  } else {
    _addEventListener = 'attachEvent';
    _removeEventListener = 'detachEvent';
    prefix = 'on';
  }

  // detect available wheel event
  support = 'onwheel' in document.createElement('div') ? 'wheel' // 各个厂商的高版本浏览器都支持"wheel"
    : document.onmousewheel !== undefined ? 'mousewheel' // Webkit 和 IE一定支持"mousewheel"
      : 'DOMMouseScroll'; // 低版本firefox

  window.removeWheelListener = function(elem, callback) {
    _removeWheelListener(elem, callback);

    // handle MozMousePixelScroll in older Firefox
    if (support === 'DOMMouseScroll') {
      _removeWheelListener(elem, 'MozMousePixelScroll', callback);
    }
  };

  window.addWheelListener = function(elem, callback, useCapture) {
    _addWheelListener(elem, support, callback, useCapture);

    // handle MozMousePixelScroll in older Firefox
    if (support === 'DOMMouseScroll') {
      _addWheelListener(elem, 'MozMousePixelScroll', callback, useCapture);
    }
  };

  function _removeWheelListener(elem, eventName, callback) {
    elem[ _removeEventListener ](prefix + eventName, callback);
  }

  function _addWheelListener(elem, eventName, callback, useCapture) {
    callback = support === 'wheel' ? callback : function(originalEvent) {
      !originalEvent && (originalEvent = window.event);

      // create a normalized event object
      var event = {
        // keep a ref to the original event object
        originalEvent: originalEvent,
        target: originalEvent.target || originalEvent.srcElement,
        type: 'wheel',
        deltaMode: originalEvent.type === 'MozMousePixelScroll' ? 0 : 1,
        deltaX: 0,
        deltaZ: 0,
        preventDefault: function() {
          originalEvent.preventDefault
            ? originalEvent.preventDefault()
            : originalEvent.returnValue = false;
        }
      };

      // calculate deltaY (and deltaX) according to the event
      if (support === 'mousewheel') {
        event.deltaY = -1 / 40 * originalEvent.wheelDelta;
        // Webkit also support wheelDeltaX
        originalEvent.wheelDeltaX && (event.deltaX = -1 / 40 * originalEvent.wheelDeltaX);
      } else {
        event.deltaY = originalEvent.detail;
      }

      // it's time to fire the callback
      return callback(event);
    };

    elem[ _addEventListener ](prefix + eventName, callback, useCapture || false);
  }
})(window, document);

参考 MDN scroll

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值