相信使用者在浏覽Google Map 時,都注意到向上或向下滾動滑鼠可以使地圖放大或縮小。其實,對于滑鼠滾動我們并不陌生。但要給一個元素綁定滑鼠滾動事件,我們有必要對該事件有一個詳盡的了解。
浏覽器對該事件支援情況如何?IE6, Opera9+, Safari2+以及Firefox1+均支援“onmousewheel”事件,在FF 3.x中,與之相當的是“DOMMouseScroll”事件。“onmousewheel”作為事件名,不為其識别。是以,為了保證能在每個浏覽器中都能運作,就需要針對不同的浏覽器來綁定不同的事件。
varmousewheelevt=(/Firefox/i.test(navigator.userAgent))?"DOMMouseScroll": "mousewheel"//FF doesn't recognize mousewheel as of FF3.x
if(document.attachEvent) //if IE (and Opera depending on user setting)
document.attachEvent("on"+mousewheelevt, function(e){alert('Mouse wheel movement detected!')})
elseif(document.addEventListener) //WC3 browsers
document.addEventListener(mousewheelevt, function(e){alert('Mouse wheel movement detected!')}, false)
上面的代碼給document綁定了mousewheel事件,并能在所有浏覽器中運作。但是,滑鼠每向上或向下移動一次,滾動了多少?當該事件觸發時,在non-FF浏覽器中,記錄其距離的是“wheelDelta”,它傳回的總是120的倍數(120表明mouse向上滾動,-120表明滑鼠向下滾動)。在FF中,記錄其滾動距離的是“detail”屬性,它傳回的是3的倍數(3表明mouse向下滾動,-3表明mouse向上滾動)。
需要注意的是,Opera 響應“onmousewheel”事件時,它同時擁有“wheelDelta”和“detail”屬性。其“detail”屬性傳回的值與FF中相同。是以,對Opera 應該用“detail”屬性來mouse滾動的距離。在觸發滾動事件時,我希望得到整數1或-1。通過上面的分析,我們可以很輕松的得到我們想要的值,對于“wheelDelta”,隻需要除以120,對于“detail”,将其除以3即可。
functiondisplayDelta(e){
varevt =window.event ||e;
vardelta =evt.detail ?-evt.detail /3: evt.wheelDelta /120;
returndelta ;
}
有了上面的分析,我們可以建構自己的函數為一個對象綁定mousewheel事件。即:
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsISPrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdsATOfd3bkFGazxCMx8VesATMfhHLlN3XnxCMwEzX0xiRGZkRGZ0Xy9GbvNGLpZTY1EmMZVDUSFTU4VFRR9Fd4VGdsYTMfVmepNHLrJXYtJXZ0F2dvwVZnFWbp1zczV2YvJHctM3cv1Ce-YWan5yMwgDNiVTN3kTMyUWMyEmYxEGNkhjN3MGO3czY2MmZy8CX1AzLchDMxIDMy8CXn9Gbi9CXzV2Zh1WavwVbvNmLvR3YxUjL4M3Lc9CX6MHc0RHaiojIsJye.gif)
functionwheel(obj, fn ,useCapture){
varmousewheelevt=(/Firefox/i.test(navigator.userAgent))?"DOMMouseScroll": "mousewheel"//FF doesn't recognize mousewheel as of FF3.x
if(obj.attachEvent) //if IE (and Opera depending on user setting)
obj.attachEvent("on"+mousewheelevt, handler, useCapture);
elseif(obj.addEventListener) //WC3 browsers
obj.addEventListener(mousewheelevt, handler, useCapture);
functionhandler(event) {
vardelta =0;
varevent =window.event ||event ;
vardelta =event.detail ?-event.detail/3 : event.wheelDelta/120;
if(event.preventDefault)
event.preventDefault();
event.returnValue =false;
returnfn.apply(obj, [event, delta]);
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsISPrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdsATOfd3bkFGazxCMx8VesATMfhHLlN3XnxCMwEzX0xiRGZkRGZ0Xy9GbvNGLpZTY1EmMZVDUSFTU4VFRR9Fd4VGdsYTMfVmepNHLrJXYtJXZ0F2dvwVZnFWbp1zczV2YvJHctM3cv1Ce-YWan5yMwgDNiVTN3kTMyUWMyEmYxEGNkhjN3MGO3czY2MmZy8CX1AzLchDMxIDMy8CXn9Gbi9CXzV2Zh1WavwVbvNmLvR3YxUjL4M3Lc9CX6MHc0RHaiojIsJye.gif)