js事件委托

前言

事件委托,也叫事件代理,是js事件中的一種常用技巧。
事件委托的原理就是利用冒泡事件的機制,為一些節點的祖先節點指定事件處理方法,當子節點觸發事件時,從觸發事件的節點向上冒泡,直到傳遞至document。在冒泡的過程中,會觸發祖先節點設定好的事件處理函數,可用來處理一系列相似事件。

事件委托的實現與優點

比如在一個<ul>當中,有100個<li>元素,當我們想讓每個li元素在被點擊的時候,輸出li元素內的文本。
不用事件委托時,大概是這樣處理

let list=document.querySelectorAll('ul li')
for(let v of list){
  v.onclick=function(){
    console.log(this.innerText)
  }
}

這樣的方法雖然能達成目標,但是為每個節點添加事件,效率太低;并且如果在ul中新加入li元素,又要為新加入的節點添加該事件,很麻煩。
這時,事件委托就是一個比較好的事件處理方法了。
事件委托里有一個重要的屬性target,target 事件屬性可返回事件的目標節點(觸發該事件的節點),如生成事件的元素、文檔或窗口。

ul.onclick=function(e){
  console.log(e.target)        //輸出點擊的節點
}

這樣就可以只為li元素的父元素指定事件處理方法,來處理所有li子元素的事件了。

let ul=document.querySelector('ul')
ul.onclick=function(e){
  console.log(e.target.innerText)
}

使用事件委托之后,后添加的li子元素也自動擁有該事件處理功能,并不需要為其另外添加事件處理功能。

為一系列特定的元素事件委托

有的時候,我想用事件委托去進行事件處理,但是我只想處理特定的節點的事件。舉個栗子,比如一個div元素中,有50個p元素,50個span元素,我只希望當p元素被點擊時輸出該元素內容,這時可以加入一定條件過濾。

let div=document.querySelector('div')
div.onclick=function(e){
  if(e.target.nodeName=='P'){
    console.log(e.target.innerText)
  }
}

只舉個栗子,其他的情況,可以自由發揮。

target和currentTarget的區別

target返回觸發事件的元素
currentTarget返回綁定事件的元素

在上面的例子中,target返回當前點擊的元素,currentTarget返回綁定事件的元素,即div元素

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 一直以來,對js的一些概念還是不清晰的,很多都沒有搞明白,今天無意間在群里見他們提起事件委托,所以查找了一些資料,...
    蝴蝶結199007閱讀 290評論 1 3
  • 定義:通俗的講,事件就是onclick,onmouseover,onmouseout等就是事件,委托呢,就是讓別人...
    JYOKETSU3閱讀 346評論 0 0
  • 我們收取快遞有兩種方法:一是在特定的地點等快遞的到來,二是委托人代收。現實當中,我們大都采用委托的方案。而委托人接...
    饑人谷_oathy閱讀 781評論 0 2
  • (續jQuery基礎(1)) 第5章 DOM節點的復制與替換 (1)DOM拷貝clone() 克隆節點是DOM的常...
    凜0_0閱讀 1,370評論 0 8
  • 得病的人閱讀 91評論 0 0