【Js】鼠標滾輪事件


原文地址: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);

 

 

 


免責聲明!

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



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