Js 事件偵聽和刪除


事件偵聽

  • addEventListener : 非 IE 7 8 下使用
  • 語法: 元素.addEventListener('事件類型', 事件處理函數, 冒泡還是捕獲)

要點:

  1. 偵聽事件函數不能帶入參數;
  2. 偵聽事件函數有且僅有一個參數e,就是事件接收到事件對象,其他函數沒有;
  3. 事件函數不能寫return 返回值,但是可以用return跳出,不再執行下去;
   <button id="bn0">按鈕</button>
   <script>
        var bn=document.querySelector("button");
        bn.addEventListener("click",clickHandler1);
        bn.addEventListener("click",clickHandler2);
            
        function clickHandler1(e){
            num++;
            console.log("aaa");
            if(num>1){
                // this是事件偵聽的對象
                // e.currentTarget.removeEventListener("click",clickHandler1);
                //將clickHandler1事件移除
                this.removeEventListener("click",clickHandler1);
            }
        }

        function clickHandler2(e){
            // console.log("bbb");
            console.log(e.type)
        }
        
   </script>

注意:

- 當你點擊 bn 的時候,兩個函數都會執行,並且會按照你注冊的順序執行
- 當元素的事件不再使用時,必須刪除,否則會造成內存堆積,偵聽事件都會被存儲在堆中
- 當元素被刪除了,也必須刪除該元素的所有事件
  • attachEvent :IE 7 8 下使用
  • 語法: 元素.attachEvent('事件類型', 事件處理函數)
bn.attachEvent('onclick', function () {
 console.log('我是第一個事件')
})
​
bn.attachEvent('onclick', function () {
 console.log('我是第二個事件')
})

當你點擊 bn 的時候,兩個函數都會執行,並且會按照你注冊的順序倒敘執行
先打印 我是第二個事件 再打印 我是第一個事件
注意: 事件類型的時候要寫 on,點擊事件就行 onclick

兩個方式的區別

  • 注冊事件的時候事件類型參數的書寫

addEventListener : 不用寫 on
attachEvent : 要寫 on
-參數個數
addEventListener : 一般是三個常用參數
attachEvent : 兩個參數
-執行順序
addEventListener : 順序注冊,順序執行
attachEvent : 順序注冊,倒敘執行
-適用瀏覽器
addEventListener : 非 IE 7 8 的瀏覽器
attachEvent : IE 7 8 瀏覽器

addEventListener() 和 onclick的區別:

  • onclick不能同時執行兩個函數,addEventListener()可以執行兩個不同的函數;
  • 移除事件偵聽的方式不同
document.onclick=function(){
	document.onclick=null;//移除事件偵聽
        console.log("a")
}
//事件會覆蓋上面的事件
document.onclick=function(){
    console.log("b");
}

document.addEventListener("click",clickHandler1);
document.addEventListener("click",clickHandler2);
function clickHandler1(e){
	//移除事件偵聽
	document.removeEventListener("click",clickHandler1);
        console.log("a");
}
function clickHandler2(e){
           //不會覆蓋上面的事件
          console.log("b");
}

  • 事件匿名函數的不斷迭代就會造成回調地獄,而使用事件注冊時用的是命名函數就會減少造成回調地獄
// 事件匿名函數的不斷迭代就會造成回調地獄
document.onclick=function(){
    var bn=document.querySelector("button");
    bn.onclick=function(){
        console.log("aaa");
    }
}

注意:以后寫函數就不使用匿名函數

  • addEventListener可以在捕獲階段和冒泡階段觸發,而onclick只能冒泡階段觸發
 document.body.addEventListener("click", clickHandler);//冒泡階段執行
 document.body.addEventListener("click", clickHandler,true);//捕獲階段執行

  • onclick支持IE低版本,addEventListener不支持IE8一下,低版本的IE使用 attachEvent 進行事件偵聽;使用 detachEvent 移除事件偵聽。
document.attachEvent("onclick",clickHandler);//IE8及以下使用,其他版本和其他瀏覽器不支持
function clickHandler(e){
    console.log("aaa");
    document.detachEvent("onclick",clickHandler);//移除事件偵聽
}

事件偵聽和移除的兼容寫法:

function addEvent(elem,type,eventHandler){
    try{
        elem.addEventListener(type,eventHandler);
    }catch(e){
        elem.attachEvent("on"+type,eventHandler);
    }
}

function removeEvent(elem,type,eventHandler){
    try{
        elem.removeEventListener(type,eventHandler);
    }catch(e){
        elem.detachEvent("on"+type,eventHandler);
    }
}

addEvent(document,"click",clickHandler);
function clickHandler(){

}

高級版:事件偵聽

js部分

        //獲取元素
        var bn0=document.getElementById("bn0");
         //綁定事件
        on(bn0,"click",clickHandler);

        function clickHandler(e){
            console.log(e);
        }
        
         //偵聽事件
        function on(target,type,handler){
            var b=judgeBrowser("IE");
            if(b && Number(b)<9){
                target.attachEvent("on"+type,handler);
            }else{
                target.addEventListener(type,handler);
            }
       }
         /* 
        
            獲取瀏覽器和版本

            通過瀏覽器打開,會返回當前瀏覽器名和版本號
            return 
                數組   [瀏覽器:String,瀏覽器版本號:String]
        
         */
        function getBrowserRV(){
            var str=navigator.userAgent;
            // 判斷是否是Chrome
            if(str.indexOf("Chrome")>-1){
                var index=str.indexOf("Chrome");
                return str.slice(index,str.indexOf(" ",index+1)).split("/");
            }
             // 判斷是否是Firefox
            if(str.indexOf("Firefox")>-1){
                var index=str.indexOf("Firefox");
                return str.slice(index).split("/");
            }
            // 判斷是否是IE11
            if(str.indexOf("rv:")>-1 && str.indexOf("Trident")>-1){
                return ["IE","11"];
            }
            // 判斷是否是IE10及以下
            if(str.indexOf("Trident")>-1){
                var index=str.indexOf("MSIE");
                return ["IE",str.slice(index,str.indexOf(";",index)).split(" ")[1]];
            }
        }  

        
        //判斷瀏覽器版本
         function judgeBrowser(browser){
            var arr=getBrowserRV();
            if(browser.toLowerCase()===arr[0].toLowerCase()){
                return arr[1];
            }else{
                return false;
            }
        }

       
   


免責聲明!

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



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