JavaScript滾輪事件兼容性寫法

吳青強 8年前發布 | 14K 次閱讀 JavaScript開發 JavaScript

研究滾輪事件是因為在做一個翻版的fullpage.js,需要通過監聽滾輪事件進行翻頁。在實現過程中遇到了一些兼容性問題處理。所以順便封裝了個方法wheel(upFn, downFn),方便日后調用。

但W3C并沒有對鼠標滾輪事件進行規范,各瀏覽器廠商封裝了不同的實現方法,事件屬性也不一樣,號稱最標準的FireFox,用了一個私有實現DOMMouseScroll。不過,其他瀏覽器都是用onmousewheel實現,所以做兼容處理的難度也不大。

瀏覽器 實現方法 事件屬性 向上滾動 向下滾動
FireFox DOMMouseScroll detail -3的倍數 3的倍數
非FireFox onmousewheel wheelDelta 120的倍數 -120的倍數

在FireFox下,DOMMouseScroll必須通過addEventListener來綁定,如:
element.addEventListener("DOMMouseScroll",func,false) ;

在非FireFox下,就沒有限制了,除了addEventListener方法,還可用下邊的代碼:
element.onmousewheel=function(){};

封裝代碼如下:

// 滾輪響應事件
// 參數:type有兩個屬性值,分別為"up"(滾輪向上)和"down"(滾輪向下)
function wheel(upFn, downFn) {
    // IE6
    window.onmousewheel = getWheelDalta;
    // Firefox
    if(window.addEventListener) {
        window.addEventListener("DOMMouseScroll", getWheelDalta, false);
    }
    // 獲得鼠標滾輪事件
    function getWheelDalta(event) {
        var event = event || window.event;
        var delta = 0;
        // delta的返回值為正時,表示向前滾動;delta的返回值為負時,表示向后滾動;
        if (event.wheelDelta) {
            // IE中,鼠標滾輪信息存放在wheelDelta屬性中;向前滾動時,wheelDelta的值是120的倍數;向后滾動時,wheelDelta的值是-120的倍數;
            delta = event.wheelDelta/120; 
            if (window.opera) delta = -delta;
        } else if (event.detail) {
            // Firefox的鼠標滾輪信息存放在detail屬性中;向前滾動,detail的值是-3的倍數;向后滾動,detail的值是3的倍數;
            delta = -event.detail/3;
        }
        // 執行滾輪事件函數
        if(delta > 0) {
            upFn();
        }else {
            downFn();
        }

        // 阻止默認行為,防止當頁面本身就存在滾動條時出現的異常
        prevent(event);
        function prevent(evt){
            if(evt.preventDefault){
                evt.preventDefault();
            }else{
                evt.returnValue = false;
            }
        }
    }   
}

測試調用:

function wheelUp() {
    alert("wheelUp");
}
function wheelDown() {
    alert("wheelDown");
}
wheel(wheelUp, wheelDown);

來自:http://www.dengzhr.com/js/440  

 本文由用戶 吳青強 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!