[JS] - onmusewheel事件(兼容IE,FF,opera,safari,chrome)


來源:http://www.denisdeng.com/?p=685

 

相信用戶在瀏覽Google Map 時,都注意到向上或向下滾動鼠標可以使地圖放大或縮小。其實,對於鼠標滾動我們並不陌生。但要給一個元素綁定鼠標滾動事件,我們有必要對該事件有一個詳盡的了解。

瀏覽器對該事件支持情況如何?IE6, Opera9+, Safari2+以及Firefox1+均支持“onmousewheel”事件,在FF 3.x中,與之相當的是“DOMMouseScroll”事件。“onmousewheel”作為事件名,不為其識別。所以,為了保證能在每個瀏覽器中都能運行,就需要針對不同的瀏覽器來綁定不同的事件。

var mousewheelevt=(/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!')})
else if(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即可。

 

function displayDelta(e){
var evt =window.event ||e;
var delta =evt.detail ?-evt.detail /3: evt.wheelDelta /120;
return delta ;
}

有了上面的分析,我們可以構建自己的函數為一個對象綁定mousewheel事件。即:

function wheel(obj, fn ,useCapture){
var mousewheelevt=(/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);

function handler(event) {
var delta =0;
var event =window.event ||event ;
var delta =event.detail ?-event.detail/3 : event.wheelDelta/120;
if(event.preventDefault)
event.preventDefault();
event.returnValue =false;
return fn.apply(obj, [event, delta]);
}
}

 其他一些onmousewheel的用法

<html> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" /> 
<title>滾輪取值效果 -http://www.jb51.net/</title> 
</head> 

<body> 
<p><label for="wheelDelta">滾動值:</label>(IE/Opera)<input type="text" id="wheelDelta" /></p> 
<p><label for="detail">滾動值:(Firefox)</label><input type="text" id="detail" /></p> 
<script type="text/javascript"> 
var oTxt=document.getElementById("txt"); 
/*********************** 
* 函數:判斷滾輪滾動方向 
* 作者:walkingp 
* 參數:event 
* 返回:滾輪方向 1:向上 -1:向下 
*************************/ 
var scrollFunc=function(e){ 
    var direct=0; 
    e=e || window.event; 
     
    var t1=document.getElementById("wheelDelta"); 
    var t2=document.getElementById("detail"); 
    if(e.wheelDelta){//IE/Opera/Chrome 
        t1.value=e.wheelDelta; 
    }else if(e.detail){//Firefox 
        t2.value=e.detail; 
    } 
    ScrollText(direct); 
} 
/*注冊事件*/ 
if(document.addEventListener){ 
    document.addEventListener('DOMMouseScroll',scrollFunc,false); 
}//W3C 
window.onmousewheel=document.onmousewheel=scrollFunc;//IE/Opera/Chrome 
</script> 
</body> 
</html> 

注:“window.onmousewheel=document.onmousewheel”在chrome,opera,safari中會觸發兩次事件,可檢測瀏覽器來區分。ie下僅支持“document.onmousewheel”事件。

 

IE/Opera屬於同一類型,使用attachEvent即可添加滾輪事件。

 

/*IE注冊事件*/ 
if(document.attachEvent){ 
document.attachEvent('onmousewheel',scrollFunc); 
}

 

Firefox使用addEventListener添加滾輪事件

 

/*Firefox注冊事件*/ 
if(document.addEventListener){ 
document.addEventListener('DOMMouseScroll',scrollFunc,false); 
}

Safari與Chrome屬於同一類型,可使用HTML DOM方式添加事件 
window.onmousewheel=document.onmousewheel=scrollFunc;//IE/Opera/Chrome 
其中除Firefox外其余均可使用HTML DOM方式添加事件,因此添加事件使用以下方式

/*注冊事件*/ 
if(document.addEventListener){ 
document.addEventListener('DOMMouseScroll',scrollFunc,false); 
}//W3C 
window.onmousewheel=document.onmousewheel=scrollFunc;//IE/Opera/Chrome

 

也可以這樣

if(document.attachEvent){document.attachEvent("on"+mousewheel, scrollFunc)}//ie
if(document.addEventListener){document.addEventListener(mousewheel, scrollFunc, false)}//Opera/Chrome/safari

判斷滾輪向上或向下在瀏覽器中也要考慮兼容性,現在五大瀏覽器(IE、Opera、Safari、Firefox、Chrome)中Firefox 使用detail,其余四類使用wheelDelta;兩者只在取值上不一致,代表含義一致,detail與wheelDelta只各取兩個 值,detail只取±3,wheelDelta只取±120,其中正數表示為向上,負數表示向下。

 

var scrollFunc=function(e){ 
e=e || window.event;
if(e.wheelDelta){alert(e.wheelDelta);//IE/Opera/Chrome ±120

}
else if(e.detail){alert(e.detail)//Firefox ±3 

}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM