天天看點

DOM事件進階①(注冊、删除事件)

文章目錄

  • ​​注冊事件(綁定事件)​​
  • ​​注冊事件概述​​
  • ​​addEventListener 事件監聽方式​​
  • ​​attachEvent 事件監聽方式​​
  • ​​注冊事件相容性解決方案​​
  • ​​删除事件(解綁事件)​​
  • ​​删除事件的方式​​
  • ​​删除事件相容性解決方案​​

注冊事件(綁定事件)

注冊事件概述

給元素添加事件,稱為注冊事件或者綁定事件。

注冊事件有兩種方式:

  • 傳統方式
  • 方法監聽注冊方式

①傳統注冊方式

  • 利用 on 開頭的事件 onclick
  • <button οnclick=“alert(‘hi~’)”></button>
  • btn.onclick = function() {}
  • 特點: 注冊事件的唯一性
  • 同一個元素同一個事件隻能設定一個處理函數,最後注冊的處理函數将會覆寫前面注冊的處理函數

②方法監聽注冊方式

  • w3c 标準 推薦方式
  • addEventListener() 它是一個方法
  • IE9 之前的 IE 不支援此方法,可使用 attachEvent() 代替
  • 特點:同一個元素同一個事件可以注冊多個監聽器
  • 按注冊順序依次執行

addEventListener 事件監聽方式

文法:

eventTarget.addEventListener(type, listener[, useCapture])      

eventTarget.addEventListener()方法将指定的監聽器注冊到 eventTarget(目标對象)上,當該對象觸發指定的事件時,就會執行事件處理函數。

該方法接收三個參數:

  • type:事件類型字元串,比如 click 、mouseover ,注意這裡不要帶on
  • listener:事件處理函數,事件發生時,會調用該監聽函數
  • useCapture:可選參數,是一個布爾值,預設是 false。

例如:

<script>
        var btns = document.querySelectorAll('button');
            // 事件偵聽注冊事件 addEventListener 
            // (1) 裡面的事件類型是字元串 必定加引号 而且不帶on
            // (2) 同一個元素 同一個事件可以添加多個偵聽器(事件處理程式)
        btns[1].addEventListener('click', function() {
            alert(22);
        })
        btns[1].addEventListener('click', function() {
                alert(33);
            })
            // 3. attachEvent ie9以前的版本支援
        btns[2].attachEvent('onclick', function() {
            alert(11);
        })
    </script>      

attachEvent 事件監聽方式

eventTarget.attachEvent(eventNameWithOn, callback)      

eventTarget.attachEvent()方法将指定的監聽器注冊到 eventTarget(目标對象) 上,當該對象觸發指定的事件時,指定的回調函數就會被執行。

該方法接收兩個參數:

  • eventNameWithOn:事件類型字元串,比如 onclick 、onmouseover ,這裡要帶 on
  • callback: 事件處理函數,當目标觸發事件時回調函數被調用
注意:IE8 及早期版本支援

例如:

[2].attachEvent('onclick', function() {
            alert(11);
        })      

注冊事件相容性解決方案

function addEventListener(element, eventName,) {
   // 判斷目前浏覽器是否支援 addEventListener 方法
   if (element.addEventListener) {
   element.addEventListener(eventName, fn); // 第三個參數 預設是false
   } else if (element.attachEvent) {
   element.attachEvent('on' + eventName, fn);
   } else {
   // 相當于 element.onclick = fn;
   element['on' + eventName] = fn;
 }      
相容性處理的原則: 首先照顧大多數浏覽器,再處理特殊浏覽器

删除事件(解綁事件)

删除事件的方式

  1. 傳統注冊方式

eventTarget.onclick = null;

  1. 方法監聽注冊方式

① eventTarget.removeEventListener(type, listener[, useCapture]);

② eventTarget.detachEvent(eventNameWithOn, callback);

<body>
    <div>1</div>
    <div>2</div>
    <div>3</div>
    <script>
        var divs = document.querySelectorAll('div');
        divs[0].onclick = function() {
                alert(11);
                // 1. 傳統方式删除事件
                divs[0].onclick = null;
            }
            // 2. removeEventListener 删除事件
        divs[1].addEventListener('click', fn) // 裡面的fn 不需要調用加小括号

        function fn() {
            alert(22);
            divs[1].removeEventListener('click', fn);
        }
        // 3. detachEvent
        divs[2].attachEvent('onclick', fn1);

        function fn1() {
            alert(33);
            divs[2].detachEvent('onclick', fn1);
        }
    </script>
</body>      

删除事件相容性解決方案

function removeEventListener(element, eventName,) {
   // 判斷目前浏覽器是否支援 removeEventListener 方法
   if (element.removeEventListener) {
   element.removeEventListener(eventName, fn); // 第三個參數 預設是false
   } else if (element.detachEvent) {
   element.detachEvent('on' + eventName, fn);
   } else {
   element['on' + eventName] = null;
 }      

繼續閱讀