currentTarget與target區別
標題中兩個屬性都屬於事件物件。
有時它們兩個返回值完全一樣,所以具有一定的迷惑性。
下面將通過程式碼例項詳細分析一下它們之間的區別與應用。
首先看一段程式碼例項:
[HTML] 純文字檢視 複製程式碼執行程式碼<!DOCTYPE html> <html> <head> <meta charset=" utf-8"> <meta name="author" content="http://www.softwhy.com/" /> <title>螞蟻部落</title> <style type="text/css"> #ant{ width:100px; height:60px; background-color:#ccc; } </style> <script> window.onload=function(){ let obox = document.getElementById("ant"); obox.onclick = function (ev) { console.log(event.target.id); console.log(event.currentTarget.id); } } </script> </head> <body> <div id="ant"></div> </body> </html>
點選div元素,然後在控制檯檢視執行效果。
程式碼內容截圖如下:
點選div元素之後,可以將兩個屬性返回元素的id屬性值在控制檯列印出來。
可以看到這兩個元素返回值是完全一樣的,如果總是一樣,那麼官方建立兩個屬性將毫無意義了。
再來看一段程式碼例項:
[HTML] 純文字檢視 複製程式碼執行程式碼<!DOCTYPE html> <html> <head> <meta charset=" utf-8"> <meta name="author" content="http://www.softwhy.com/" /> <title>螞蟻部落</title> <style type="text/css"> #ant{ width:100px; height:60px; background-color:#ccc; } #inner{ width:50px; height:30px; background-color:blue; } </style> <script> window.onload=function(){ let obox = document.getElementById("ant"); let oinner=document.getElementById("inner"); obox.onclick = function (ev) { console.clear(); console.log(event.target.id); console.log(event.currentTarget.id); } } </script> </head> <body> <div id="ant"> <div id="inner"></div> </div> </body> </html>
上述程式碼點選不同的元素,在控制檯列印出不同內容。
兩個屬性的區別也得以體現:
(1).點選外層div元素,控制檯列印截圖如下:
(2).點選內部div元素,控制檯列印截圖如下:
首先給出兩個屬性的概念:
(1).currentTarget屬性返回註冊事件處理函式的元素。
(2).target屬性返回觸發事件處理函式的元素。
程式碼分析總結如下:
(1).註冊事件處理函式的元素與觸發事件的元素可能是同一個元素,就如點選外層元素。
(2).註冊事件處理函式的元素也可能與觸發事件的元素非同一元素,很多事件具有冒泡效果,比如上述程式碼,點選子元素會觸發click事件,根據冒泡原理,事件向上傳遞到父div元素,並執行註冊在其上的事件處理函式,所以點選子元素,target屬性返回子元素,currentTarget屬性返回當前處理該事件的元素,也就是註冊事件處理函式的元素,外層div元素。
特別說明:上面介紹的都是原生JavaScript中的概念,很多庫可能已經將其修改。
屬性的使用案例:
最常見的是利用事件冒泡來實現委託效果,所謂的委託,就是讓自己的事情委託給別人辦理。
程式碼例項如下:
[HTML] 純文字檢視 複製程式碼執行程式碼<!DOCTYPE html> <html> <head> <meta charset=" utf-8"> <meta name="author" content="http://www.softwhy.com/" /> <title>螞蟻部落</title> <style> table { width: 300px; height: 60px; background-color: green; } table td { background-color: white; } </style> <script> window.onload=function(){ let otable=document.getElementsByTagName("table")[0]; let odiv=document.getElementsByTagName("div")[0]; otable.onclick=function(ev){ odiv.innerHTML=ev.target.innerHTML; } } </script> </head> <body> <table cellspacing="1"> <tr> <td>單元格一</td> <td>單元格二</td> <td>單元格三</td> <td>單元格四</td> </tr> <tr> <td>單元格五</td> <td>單元格六</td> <td>單元格七</td> <td>單元格八</td> </tr> </table> <div></div> </body> </html>
上述程式碼點選單元格,會將其中的內容寫入div中。
程式碼分析如下:
(1).我們並沒有將事件處理函式註冊在每一個td之上,而是利用事件冒泡註冊在table之上。
(2).好處很明顯,效能比較好,程式碼也更為清爽,新新增的td元素具有同樣的功能。
(3).利用target屬性即可獲取觸發事件的元素,也就是我們點選的單元格,然後將其內容寫入div。
上面就是委託,本來td單元格的活,交給table去做。
相關文章
- currentTarget VS target
- 一句話區分currentTarget和target
- 所以,e.target 和 e.currentTarget 到底有啥區別呢?
- 事件關鍵詞 bind 和 catch 的區別、事件物件 target 和 currentTarget 的差異事件物件
- JavaScript event.currentTargetJavaScript
- ??與?:的區別
- mouseenter與mouseover區別
- mouseout與mouseleave區別
- classList與className區別
- innerText與textContent區別
- GET與POST區別
- let與const區別
- NIO與IO區別
- 區別mouseover與mouseenter?
- ApplicationContext 與 BeanFactory 區別APPContextBean
- setInterval()與setTimeout()區別
- match()與exec()區別
- localStorage與sessionStorage 區別Session
- showModal()與show() 區別
- <section>與<article> 區別
- onmouseover與onmouseenter區別
- offset與style區別
- cellpadding與cellspacing 區別padding
- animation與transition 區別
- encodeURI與encodeURIComponent區別
- JavaScript與ECMAScript 區別JavaScript
- FragmentPagerAdapter與FragmentStatePagerAdapter區別FragmentAPT
- put與putIfAbsent區別
- JavaScript 與TypeScript區別JavaScriptTypeScript
- 危險的 target=”_blank” 與 “opener”
- 危險的 target="_blank" 與 “opener”
- 適配target30返回監聽以及簡單分析finish()和onBackPressed()的區別
- __weak與__block區別,深層理解兩者區別BloC
- 值型別與引用型別的區別型別
- 耦合與聚合的區別比單體與微服務區別更重要微服務
- HashMap底層實現原理/HashMap與HashTable區別/HashMap與HashSet區別HashMap
- preventDefault()與return false區別False
- const與static的區別