マウスホイールイベント
jQueryでのマウスホイールイベントの例です。
前提知識として、
- FireFox以外のブラウザではmousewheelイベントで、FireFoxではDOMMouseScrollイベントでマウスホイールの動きをキャッチできる
- (それぞれどのプロパティでホイール量を取得するかは以下のコードを見てもらうとして)FireFox以外のブラウザでは一回のホイール回数*120が取得できるのに対して、FireFoxではホイール回数*3が返ってくる
- FireFoxとそれ以外ではホイール量の正負が反対
以下がコードです。
jQuery.event.fixHooks.mousewheel = { props: jQuery.event.mouseHooks.props, filter: function(event, originalEvent){ event = jQuery.event.mouseHooks.filter(event, originalEvent); event.deltaX = (originalEvent.wheelDeltaX === undefined)?0:originalEvent.wheelDeltaX; event.deltaY = (originalEvent.wheelDeltaY === undefined)?originalEvent.wheelDelta:originalEvent.wheelDeltaY; event.deltaX /= -120; event.deltaY /= -120; return event; } }; jQuery.event.fixHooks.DOMMouseScroll = { props: jQuery.event.mouseHooks.props, filter: function(event, originalEvent){ event = jQuery.event.mouseHooks.filter(event, originalEvent); var delta = originalEvent.detail; if(originalEvent.axis !== undefined && originalEvent.asix == originalEvent.HORIZONTAL_AXIS){ event.deltaX = delta; event.deltaY = 0; } else { event.deltaX = 0; event.deltaY = delta; } event.deltaX /= 3; event.deltaY /= 3; return event; } }; if(window.sidebar){ //if Firefox jQuery.event.special.mousewheel = { bindType: 'DOMMouseScroll', delegateType: 'DOMMouseScroll', handle: function(e){ var handleObj = e.handleObj; e.type = handleObj.origType; var ret = handleObj.handler.apply(this, arguments); e.type = handleObj.type; return ret; } }; } jQuery.fn.extend('mousewheel', function(data, fn){ if (fn == null) { fn = data; data = null; } return arguments.length > 0 ? this.on('mousewheel', null, data, fn) : this.trigger('mousewheel'); });
FireFoxのときだけ、bindTypeを使ってmousewheelイベントをDOMMouseScrollに回して、それ以外のブラウザではブラウザから貰うホイール量をいじるだけです。
bindTypeを設定したとき、fixHooksはbindTypeで指定された方のイベントに対して呼ばれることに注意(今の例で言えば、FirefoxではDOMMouseScrollイベントに対してfixHooksが呼ばれる)。
横スクロールは、一部ブラウザでしか対応していないようです(横スクロールできるマウスを持っていないので試せませんでした(笑))
#2012年11月28日 Firefox判定部分を変更、mousewheelメソッド登録部分を修正