原文地址:http://www.joy-studio.com/frontend-develop/cross-browser-mousewheel-and-demo.html
做東西用到:加上自己的理解o(∩_∩)o 哈哈。
瀏覽器差異:firefox滾輪事件是DOMMouseScroll,其他瀏覽器使用的是mousewheel
firefox事件的event對象使用detail值表示滾輪反向,(-3)表示向上,(3)表示向下。
其他瀏覽器使用wheelDelta值表示表示滾輪方向,(120)表示向上, (-120)表示向下。
監聽事件,刪除監聽事件:IE678使用attachEvent/detachEvent, 其他瀏覽器使用addEventListener/removeEventListener。
fixedEvent:判斷滾輪方向
fixedFn:滾動滾輪取消滾輪的默認滾動網頁行為
el.wheelHash:把fixedFn存放到對象的wheelHash屬性
1 var mousewheel = (function(){ 2 var types =['DOMMouseScroll','mousewheel']; 3 4 fixedEvent = function(e){ 5 e.wheel = (e.wheelDelta? e.wheelDelta : -e.detail) > 0? 1 : -1;// 通過事件判斷鼠標滾輪反向,1是向上,-1是向下 6 e.wheelDir = e.wheel > 0? 'up' : 'down'; //這個只是描述 e.wheel的值和滾輪方向的關系 7 return e; 8 }; 9 10 return{//返回mousewheel的方法 11 on: function(el, fn, preventDefault){ //mousewheel對象的on方法, el觸發mousewheel事件對象,fn觸發后執行函數,preventDefault是否阻止默認行為:滾輪的網頁滾動效果 12 if(typeof preventDefault != 'boolean'){ //如果傳入的實參preventDefault不是布爾值 13 preventDefault = true; //初始化為true 14 } 15 16 var fixedFn = function(e){ //阻止默認行為函數 17 e = fixedEvent(e || window.event); // 兼容寫法, 返回的e用來判斷滾輪方向 18 if(preventDefault){ // 如果需要阻止默認行為 19 if(e.preventDefault){ //firefox 20 e.preventDefault(); 21 } 22 else{ 23 e.returnValue = false; //ie 24 } 25 }; 26 27 fn.call(el, e); //el事件對象調用fn函數,參數為e; 注意fn中使用e.wheel去判斷鼠標滾輪事件 28 }, 29 wheelHash = el.wheelHash; //把包含fixedFn函數的 el.wheelHash屬性 賦值給 wheelHash 30 31 if(!wheelHash){ //判斷函數是否存在 wheelHash 對象 32 wheelHsah = {}; 33 wheelHash[fn] = fixedFn; //wheelHash對象的屬性fn為阻止默認行為函數 34 el.wheelHash = wheelHash; //把wheelHash對象賦值給el的wheelHash屬性 wheelHash[fn] == el.wheelHash[fn] 35 }else{ 36 if(wheelHash[fn]) return; //如果存在 wheelHash 且 wheelHash中有 fixedFn 那么返回 37 wheelHash[fn] = fixedFn; //如果沒有, 就把fixedFn賦值給wheelHash.fn 38 }; 39 40 if(document.addEventListener){ //firefox 41 var i = types.length; 42 while(i--){ //循環滾輪事件 數組 43 el.addEventListener(types[i], fixedFn, false); //firefox el監聽滾輪事件,執行取消默認行為 44 } 45 } 46 else{ //ie 47 el.attachEvent('onmousewheel', fixedFn); // ie 監聽事件, 處理函數fixedFn 48 } 49 }, 50 //mousewheel中的on方法作用: 讓元素監聽事件,且處理是否執行默認行為。並且保存事件的阻止默認行為函數fixedFn到對象el.wheelHash屬性中, 51 52 un: function(el, fn){ 53 if(!el.wheelHash) return; //如果對象不存在wheelHash, 直接跳出(沒效果了); 54 var wheelHash = el.wheelHash; 55 if(document.removeEventListener){ //firefox 56 var i = types.length; 57 while(i--){ 58 el.removeEventListener(types[i],wheelHsah[fn], false); //刪除監聽事件,執行取消默認行為 59 } 60 }else{ //ie 61 el.detachEvent('onmousewheel', wheelHash[fn]); 62 } 63 delete wheelHash[fn]; //刪除 默認行為函數 64 }, 65 } 66 })(); 67 68 69 //定義滾輪事件 70 // var myWheel = function(e){ 71 // console.log(e.wheelDir); 72 // } 73 //添加滾輪事件 74 // mouseWheel.on(element, myWheel); 75 //刪除滾輪事件 76 // mouseWheel.un(element, myWheel);