JavaScript——事件高級(包括:註冊事件(綁定事件)、刪除事件(解綁事件)、DOM事件流、事件對象、事件委託、常用鼠標事件及鼠標事件對象、常用鍵盤事件及鍵盤事件對象等)

註冊事件

  • 給元素添加事件,稱爲註冊事件或者綁定事件。

  • 註冊事件有兩種方式:傳統方式和方法監聽註冊方式。

    1.傳統註冊方式:

    (1)利用on開頭的事件,比如:onclick

    (2)< button οnclick=“alert(‘hello’)”>< /button>

    (3)btn.onclick = function(){ }

    (4)特點:註冊事件的唯一性。簡單來收,就是同一個元素同一個事件只能設置一個處理函數,最後註冊的處理函數將會覆蓋前面註冊的處理函數

    2.方法監聽註冊方式:

    (1)W3C標準推薦的方式

    (2)addEventListener()是一個方法

    (3)IE9之前的IE不支持此方法,可使用attachEvent()代替

    (4)特點:同一個元素同一個事件可以註冊多個監聽器

    (5)按註冊順序依次執行

  • addEventListener事件監聽方式:

//addEventListener()的語法格式如下:
eventTarget.addEventListener(type, listener[,userCapture]);

//舉例:
var div = document.querySelector('div');
div.addEventListener('click',function(){
  alert('Hello');
})
  • eventTarget.addEventListener()方法將指定的監聽器註冊到eventTarget(目標對象)上,當該對象觸發指定的事件時,就會執行事件處理函數。

  • 該方法接收三個參數:

    1.type:事件類型字符串,比如:click、mouseover,注意這不要帶on,並且該屬性是字符串,一定要加引號。

    2.listener:事件處理函數,事件發生時,會調用該監聽函數。

    3.userCapture:可選參數,是一個布爾值,默認是false。

  • attachEvent():該特性是非標準的,儘量不要在生產環境中使用。(IE8及早期版本支持)

//attachEvent()的語法格式如下:
eventTarget.attachEvent(eventNameWithOn, callback)
  • eventTarget.attachEvent()方法將指定的監聽器註冊到eventTarget(目標對象)上,當該對象觸發指定的事件時,指定的回調函數就會被觸發。

  • 該方法接收兩個參數:

    1.eventNameWithOn:事件類型字符串,比如:onclick、onmouseover,注意要帶on。

    2.callback:事件處理函數,當目標觸發事件時回調函數被調用。

  • 註冊事件兼容性解決方案(瞭解即可):

function addEventListener(element, eventName, fn){
  //判斷當前瀏覽器是否支持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;

    2.eventTarget.removeEventListener(type, listener[,userCapture]);

    var div = document.querySelector('div');
    div.addEventListener('click',fn);	//	裏面的fn不需要加小括號調用
    function fn(){
      alert('蟹黃堡');
      div.removeEventListener('click', fn);		//由於該刪除事件方法中需要把元素註冊的事件處理函數作
      																				//爲參數,但沒法直接寫,所以需要把註冊事件的事件處理																					 //函數分開單獨寫。
    }
    

    3.eventTarget.detachEvent(eventNameWithOn, callback);

    4.刪除事件兼容性解決方案(瞭解即可):

    function removeEventListener(element, eventName, fn){
      //判斷當前瀏覽器是否支持removeEventListener方法
      if(element.removeEventListener){
        element.removeEventListener(eventName, fn);	//第三個參數默認是false
      }else if(element.detachEvent){
        element.detachEvent('on' + eventName, fn);
      }else{
        element['on' + eventName] = null;
      }
    }
    

DOM事件流

  • 事件流描述的是從頁面中接收事件的順序。簡單來說,事件發生時會在元素節點之間按照特定的順序傳播,這個傳播過程就是DOM事件流。

  • DOM事件流分爲3個階段:

    1.捕獲階段

    2.當前目標階段

    3.冒泡階段

  • 舉例:一個div註冊了點擊事件,那麼它的DOM事件流如下圖所示:

事件流.PNG
  • 事件冒泡:IE最早提出,事件開始時由最具體的元素接收,然後逐級向上傳播到DOM最頂層節點到過程。
  • 事件捕獲:網景最早提出,由DOM最頂層節點開始,然後逐級向下傳播到最具體的元素接收的過程。

注意:

  1. JS代碼只能處於捕獲或冒泡其中的一個階段。
  2. onclic和attachEvent只能得到冒泡階段。
  3. addEventListener(type, listener[,userCapture])第三個參數如果是ture,表示在事件捕獲階段調用事件處理程序;如果是false(不寫默認就是false),表示在事件冒泡階段調用事件處理程序。
  4. 實際開發中,我們很少使用事件捕獲,而是更加關注事件冒泡。
  5. 有些事件是沒有冒泡的,比如:onfocus、onblur、onmouseenter、onmouseleave。
  6. 事件冒泡有利有弊,可能會帶來麻煩,也可能帶來意想不到的好處。

事件對象

  • event對象代表事件的狀態,比如鍵盤按鍵的狀態、鼠標的位置、鼠標按鈕的狀態。簡單理解,事件發生後,跟事件相關的一系列信息數據的集合都放到這個對象裏面,這個對象就是事件對象event,她有很多屬性和方法。
//情況1:
eventTarget.onclick = function(event){}
//情況2:
eventTarget.addEventListener('click', function(event){})
//這個event就是事件對象,還可以寫成e、evt等其他自定義名稱
  • 這個event是個形參,系統幫我們設定爲事件對象,不需要傳遞實參過去。

  • 主要我們註冊事件,event對象就會被系統自動創建,並依次傳遞給事件監聽器(事件處理函數)。

  • 事件對象本身的獲取存在兼容性問題:

    1.標準瀏覽器中是瀏覽器給方法傳遞的參數,只需要定義形參e就可以獲取到。

    2.在IE6~8中,瀏覽器不會給方法傳遞參數,如果需要的話,需要到window.event中獲取查找。

  • 兼容性解決方法:

e = e || window.event;
  • 事件對象的常見屬性和方法:
事件對象屬性方法 說明
e.target 返回觸發事件的對象(標準)
e.srcElement 返回觸發對象的事件(非標準,IE6~8使用)
e.type 返回事件的類型,比如:click、mouseover等,不帶on
e.stopPropagation() 該方法阻止冒泡(標準)
e.cancelValue 該屬性阻止冒泡(非標準,IE6~8使用),使用方法:e.cancelValue = true
e.preventDefault() 該方法阻止默認事件(默認行爲)比如,不讓連接跳轉或者讓提交按鈕不提交等(標準)
e.retuenValue 該方法阻止默認事件(默認行爲)比如,不讓連接跳轉或者讓提交按鈕不提交等(非標準,IE6~8使用)
  • e.target和this的區別:e.target返回的是觸發事件的對象(元素);而this返回的是綁定事件的對象(元素)。
  • this和currentTarget的區別:this和currentTarget都是返回綁定事件的對象(元素),但是currentTarget有兼容性問題,IE6~8不能使用。
  • return false和e.preventDefault()、e.returnValue一樣,都能阻止默認行爲,但是return false後面的代碼將不會被執行,並且只適用於傳統註冊事件的方式(div.onclick = fuction() (){})。

事件委託

  • 事件委託也稱爲事件代理,在jQuery裏面稱爲事件委派。
  • 原理:不是每個子節點單獨設置事件監聽器,而是事件監聽器設置在其父節點上,然後利用冒泡原理影響設置每個子節點。
  • 作用:只需要操作一次DOM,提高了程序等性能。
<ul>
  <li>1</li>
  <li>2</li>
  <li>3</li>
  <li>4</li>
</ul>

<script>
  var ul = document.querySelector('ul');
	ul.addEventListener('click',function(e){
    //1.
    //alert('Hello!');
    //2.
    e.target.style.background = 'blue';
  })

常用的鼠標事件

  • 禁止鼠標右鍵菜單

    contextmenu主要控制應該何時顯示上下文菜單,主要用於程序員取消默認的上下文菜單。

    document.addEvnetListener('contextmenu',function(e){
      e.preventDafault();
    })
    
  • 禁止鼠標選中(selectstart 開始選中)

    document.addEventListener('selectstart',function(e){
      e.preventDefault();
    })
    
  • 鼠標事件對象(MouseEvent)

鼠標事件對象(屬性) 說明
e.clientX 返回鼠標相對於瀏覽器窗口可視區的X座標
e.clientY 返回鼠標相對於瀏覽器窗口可視區的Y座標
e.pageX 返回鼠標相對於文檔頁面的X座標,IE9+支持
e.pageY 返回鼠標相對於文檔頁面的Y座標,IE9+支持
e.screenX 返回鼠標相對於電腦屏幕的X座標
e.screenY 返回鼠標相對於電腦屏幕的Y座標

常用鍵盤事件

  • 鍵盤事件
鍵盤事件 觸發條件
onkeyup 某個鍵盤按鍵被鬆開時觸發
onkeydown 某個鍵盤按鍵被按下時觸發
onkeypress 某個鍵盤按鈕被按下時觸發,但是它不識別功能鍵,比如:ctrl、shift、箭頭等

注意:
1.如果使用addEventListener不需要加on。
2.三個事件的執行順序是:keydown——>keypress——>keyup。

  • 鍵盤事件對象(KeyboardEvent)
鍵盤事件對象(屬性) 說明
keyCode 返回該鍵的ASCII值

注意:
1.onkeydown和onkeyup不區分字母大小寫,onkeypress區分字母大小寫,比如按下a鍵或A鍵,keydown和keyup的keyCode都是65,而keypress則會區分,a鍵是97,A鍵是65。
2.在我們實際開發中,更多使用的是keydown和keyup,它們能識別所有的鍵(包括功能鍵)。
3.keypress不識別功能鍵,但是keyCode屬性能區分大小寫,返回不同的ASCII值。
4.可以利用keyCode返回的ASCII值來判斷用戶按下哪個鍵。
5.keydown和keypress在文本框裏面的特點:它們兩個事件觸發的時候,文字還沒有落入文本框中;而keyup事件觸發的時候,文本已經落入文本框裏面了。

課外知識點

  • focus()方法可以使搜索框獲得焦點。比如:input.focus()。

  • 通過::before或::after創建的元素的隱藏與顯示和被選元素的隱藏與顯示是同步的。


微信公衆號也會定期更新,覺得文章寫得還可以的,可以加個關注!點個贊!謝謝!

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章