JS滚轮事件(mousewheel/DOMMouseScroll)了解

一、浏览器兼容差异

滚轮事件的兼容性差异有些不拘一格,不是以往的IE派和其他派,而是FireFox派和其他派。
包括IE6在内的浏览器是使用onmousewheel,而FireFox浏览器使用DOMMouseScroll。

一个最简单的使用差异:

document.body.onmousewheel = function(event){
    event = event || window.event;
    console.dir(event);
};
document.body.addEventListener("DOMMouseScroll", function(event){
    console.dir(event);
}); 

以上输出差异见下表: 

属性名\浏览器 FireFox Chrome IE10 IE7
recordset ×没有该属性 ×没有该属性 ×没有该属性 null
type DOMMouseScroll mousewheel mousewheel mousewheel
fromElement ×没有该属性 null null null
toElement ×没有该属性 [object HTMLDivElement] null null
altLeft ×没有该属性 ×没有该属性 ×没有该属性 false
keyCode ×没有该属性 0 ×没有该属性 0
repeat ×没有该属性 ×没有该属性 ×没有该属性 false
reason ×没有该属性 ×没有该属性 ×没有该属性 0
data ×没有该属性 ×没有该属性 ×没有该属性 空字符串
behaviorCookie ×没有该属性 ×没有该属性 ×没有该属性 0
source ×没有该属性 ×没有该属性 ×没有该属性 null
contentOverflow ×没有该属性 ×没有该属性 ×没有该属性 false
behaviorPart ×没有该属性 ×没有该属性 ×没有该属性 0
url ×没有该属性 ×没有该属性 ×没有该属性 空字符串
dataTransfer ×没有该属性 null ×没有该属性 null
ctrlKey false false false false
shiftLeft ×没有该属性 ×没有该属性 ×没有该属性 false
dataFld ×没有该属性 ×没有该属性 ×没有该属性 空字符串
returnValue ×没有该属性 true ×没有该属性 undefined
qualifier ×没有该属性 ×没有该属性 ×没有该属性 空字符串
wheelDelta ×没有该属性 -120 -120 -120
bookmarks ×没有该属性 ×没有该属性 ×没有该属性 null
actionURL ×没有该属性 ×没有该属性 ×没有该属性 空字符串
button 0 0 0 0
srcFilter ×没有该属性 ×没有该属性 ×没有该属性 null
nextPage ×没有该属性 ×没有该属性 ×没有该属性 空字符串
cancelBubble false false false false
x ×没有该属性 799 876 839
y ×没有该属性 283 322 325
buttonID ×没有该属性 ×没有该属性 ×没有该属性 0
srcElement ×没有该属性 [object HTMLDivElement] [object HTMLDivElement] [object]
screenX 934 799 876 841
screenY 453 344 377 382
srcUrn ×没有该属性 ×没有该属性 ×没有该属性 空字符串
origin ×没有该属性 ×没有该属性 ×没有该属性 空字符串
boundElements ×没有该属性 ×没有该属性 ×没有该属性 [object]
clientX 1168 799 876 841
clientY 456 283 322 327
propertyName ×没有该属性 ×没有该属性 ×没有该属性 空字符串
shiftKey false false false false
ctrlLeft ×没有该属性 ×没有该属性 ×没有该属性 false
offsetX ×没有该属性 791 868 829
offsetY ×没有该属性 275 314 310
altKey false false false false
initMouseWheelEvent ×没有该属性 ×没有该属性 function initMouseWheelEvent() { [native code] } ×没有该属性
layerX 1168 799 876 ×没有该属性
layerY 456 283 322 ×没有该属性
which 1 1 1 ×没有该属性
buttons 0 ×没有该属性 0 ×没有该属性
metaKey false false false ×没有该属性
pageX 1168 799 876 ×没有该属性
pageY 456 283 322 ×没有该属性
relatedTarget null null null ×没有该属性
getModifierState function getModifierState(){ [native code]} ×没有该属性 function getModifierState() { [native code] } ×没有该属性
initMouseEvent function initMouseEvent() { [native code] } function initMouseEvent() { [native code] } function initMouseEvent() { [native code] } ×没有该属性
detail 3 0 0 ×没有该属性
view [object Window] [object Window] [object Window] ×没有该属性
initUIEvent function initUIEvent() { [native code] } function initUIEvent() { [native code] } function initUIEvent() { [native code] } ×没有该属性
bubbles true true true ×没有该属性
cancelable true true true ×没有该属性
currentTarget [object HTMLBodyElement] [object HTMLBodyElement] [object HTMLBodyElement] ×没有该属性
defaultPrevented false false false ×没有该属性
eventPhase 3 3 3 ×没有该属性
isTrusted true ×没有该属性 true ×没有该属性
target [object HTMLDivElement] [object HTMLDivElement] [object HTMLDivElement] ×没有该属性
timeStamp 14296937 1366106275177 1366106216522 ×没有该属性
initEvent function initEvent() { [native code] } function initEvent() { [native code] } function initEvent() { [native code] } ×没有该属性
preventDefault function preventDefault() { [native code] } function preventDefault() { [native code] } function preventDefault() { [native code] } ×没有该属性
stopImmediate
Propagation
function stopImmediatePropagation() { [native code] } function stopImmediatePropagation() { [native code] } function stopImmediatePropagation() { [native code] } ×没有该属性
stopPropagation function stopPropagation() { [native code] } function stopPropagation() { [native code] } function stopPropagation() { [native code] } ×没有该属性
AT_TARGET 2 2 2 ×没有该属性
BUBBLING_PHASE 3 3 3 ×没有该属性
CAPTURING_PHASE 1 1 1 ×没有该属性
webkitDirection
InvertedFromDevice
×没有该属性 false ×没有该属性 ×没有该属性
wheelDeltaY ×没有该属性 -120 ×没有该属性 ×没有该属性
wheelDeltaX ×没有该属性 0 ×没有该属性 ×没有该属性
webkitMovementY ×没有该属性 0 ×没有该属性 ×没有该属性
webkitMovementX ×没有该属性 0 ×没有该属性 ×没有该属性
charCode ×没有该属性 0 ×没有该属性 ×没有该属性
clipboardData ×没有该属性 undefined ×没有该属性 ×没有该属性
initWebKitWheelEvent ×没有该属性 function initWebKitWheelEvent() { [native code] } ×没有该属性 ×没有该属性
NONE 0 0 ×没有该属性 ×没有该属性
MOUSEDOWN 1 1 ×没有该属性 ×没有该属性
MOUSEUP 2 2 ×没有该属性 ×没有该属性
MOUSEOVER 4 4 ×没有该属性 ×没有该属性
MOUSEOUT 8 8 ×没有该属性 ×没有该属性
MOUSEMOVE 16 16 ×没有该属性 ×没有该属性
MOUSEDRAG 32 32 ×没有该属性 ×没有该属性
CLICK 64 64 ×没有该属性 ×没有该属性
DBLCLICK 128 128 ×没有该属性 ×没有该属性
KEYDOWN 256 256 ×没有该属性 ×没有该属性
KEYUP 512 512 ×没有该属性 ×没有该属性
KEYPRESS 1024 1024 ×没有该属性 ×没有该属性
DRAGDROP 2048 2048 ×没有该属性 ×没有该属性
FOCUS 4096 4096 ×没有该属性 ×没有该属性
BLUR 8192 8192 ×没有该属性 ×没有该属性
SELECT 16384 16384 ×没有该属性 ×没有该属性
CHANGE 32768 32768 ×没有该属性 ×没有该属性
rangeParent [object HTMLDivElement] ×没有该属性 ×没有该属性 ×没有该属性
rangeOffset 0 ×没有该属性 ×没有该属性 ×没有该属性
isChar false ×没有该属性 ×没有该属性 ×没有该属性
mozMovementX 1168 ×没有该属性 ×没有该属性 ×没有该属性
mozMovementY 576 ×没有该属性 ×没有该属性 ×没有该属性
mozPressure 0 ×没有该属性 ×没有该属性 ×没有该属性
mozInputSource 1 ×没有该属性 ×没有该属性 ×没有该属性
initNSMouseEvent function initNSMouseEvent() { [native code] } ×没有该属性 ×没有该属性 ×没有该属性
axis 2 ×没有该属性 ×没有该属性 ×没有该属性
initMouseScrollEvent function initMouseScrollEvent() { [native code] } ×没有该属性 ×没有该属性 ×没有该属性
originalTarget [object HTMLDivElement] ×没有该属性 ×没有该属性 ×没有该属性
explicitOriginalTarget [object HTMLDivElement] ×没有该属性 ×没有该属性 ×没有该属性
preventBubble function preventBubble() { [native code] } ×没有该属性 ×没有该属性 ×没有该属性
preventCapture function preventCapture() { [native code] } ×没有该属性 ×没有该属性 ×没有该属性
getPreventDefault function getPreventDefault() { [native code] } ×没有该属性 ×没有该属性 ×没有该属性
RESET 65536 ×没有该属性 ×没有该属性 ×没有该属性
SUBMIT 131072 ×没有该属性 ×没有该属性 ×没有该属性
SCROLL 262144 ×没有该属性 ×没有该属性 ×没有该属性
LOAD 524288 ×没有该属性 ×没有该属性 ×没有该属性
UNLOAD 1048576 ×没有该属性 ×没有该属性 ×没有该属性
XFER_DONE 2097152 ×没有该属性 ×没有该属性 ×没有该属性
ABORT 4194304 ×没有该属性 ×没有该属性 ×没有该属性
ERROR 8388608 ×没有该属性 ×没有该属性 ×没有该属性
LOCATE 16777216 ×没有该属性 ×没有该属性 ×没有该属性
MOVE 33554432 ×没有该属性 ×没有该属性 ×没有该属性
RESIZE 67108864 ×没有该属性 ×没有该属性 ×没有该属性
FORWARD 134217728 ×没有该属性 ×没有该属性 ×没有该属性
HELP 268435456 ×没有该属性 ×没有该属性 ×没有该属性
BACK 536870912 ×没有该属性 ×没有该属性 ×没有该属性
TEXT 1073741824 ×没有该属性 ×没有该属性 ×没有该属性
ALT_MASK 1 ×没有该属性 ×没有该属性 ×没有该属性
CONTROL_MASK 2 ×没有该属性 ×没有该属性 ×没有该属性
SHIFT_MASK 4 ×没有该属性 ×没有该属性 ×没有该属性
META_MASK 8 ×没有该属性 ×没有该属性 ×没有该属性
SCROLL_PAGE_UP -32768 ×没有该属性 ×没有该属性 ×没有该属性
SCROLL_PAGE_DOWN 32768 ×没有该属性 ×没有该属性 ×没有该属性
MOZ_SOURCE_UNKNOWN 0 ×没有该属性 ×没有该属性 ×没有该属性
MOZ_SOURCE_MOUSE 1 ×没有该属性 ×没有该属性 ×没有该属性
MOZ_SOURCE_PEN 2 ×没有该属性 ×没有该属性 ×没有该属性
MOZ_SOURCE_ERASER 3 ×没有该属性 ×没有该属性 ×没有该属性
MOZ_SOURCE_CURSOR 4 ×没有该属性 ×没有该属性 ×没有该属性
MOZ_SOURCE_TOUCH 5 ×没有该属性 ×没有该属性 ×没有该属性
MOZ_SOURCE_KEYBOARD 6 ×没有该属性 ×没有该属性 ×没有该属性
HORIZONTAL_AXIS 1 ×没有该属性 ×没有该属性 ×没有该属性
VERTICAL_AXIS 2 ×没有该属性 ×没有该属性 ×没有该属性

对照表格内容,可以看到,鼠标滚动事件与点击事件有很多类似的地方。比方说兼容部分:event.type,event.screenX/event.screenY,event.clientX/event.clientY,event.altKey,event.shiftKey,event.cancelBubble都是一样的;不兼容的部分,IE6-8的event.srcElement与其他浏览器的event.target。

在除了FireFox之外的浏览器下,滚动的上下滚动与否与这个event.wheelDelta有关。

对于FireFox浏览器(Opera浏览器也有),判断鼠标滚动方向的属性为event.detail。