探討e.target與e.currentTarget

target與currentTarget二者既有區別,也有聯繫,那麼咱們就來探討下他們的區別吧,一個通俗易懂的例子解釋一下二者的區別:javascript

 1 <!DOCTYPE html>
 2 <html>
 3 <head>
 4     <title>Example</title>
 5 </head>
 6 <body>
 7     <div id="A">
 8         <div id="B">
 9         </div>
10     </div>
11 </body>
12 </html>
var a = document.getElementById('A'),
      b = document.getElementById('B');    
function handler (e) {
    console.log(e.target);
    console.log(e.currentTarget);
}
a.addEventListener('click', handler, false);

當點擊A時:輸出:html

1 <div id="A">...<div>
2 <div id="A">...<div>

當點擊B時:輸出:java

1 <div id="B"></div>
2 <div id="A">...</div>

也就是說,currentTarget始終是監聽事件者,而target是事件的真正發出者瀏覽器

因爲要兼容IE瀏覽器,因此通常都在冒泡階段來處理事件,此時target和currentTarget有些狀況下是不同的。函數

如:this

1 function(e){
2     var target = e.target || e.srcElement;//兼容ie7,8
3     if(target){
4         zIndex = $(target).zIndex();
5     }
6 }
7 
8 //往上追查調用處
9 enterprise.on(img,'click',enterprise.help.showHelp);

IE7-8下使用$(target).zIndex();能夠獲取到 
IE7-8下使用$(e.currentTarget).zIndex();獲取不到,多是IE下既沒有target,也沒有currentTarget
spa

再來證明一下猜想,在IE瀏覽器下運行如下代碼:code

1 <input type="button" id="btn1" value="我是按鈕" />
2 <script type="text/javascript"> 
3     btn1.attachEvent("onclick",function(e){
4         alert(e.currentTarget);//undefined
5         alert(e.target);       //undefined
6         alert(e.srcElement);   //[object HTMLInputElement]
7     });
8 </script>

對象this、currentTarget和target htm

在事件處理程序內部,對象this始終等於currentTarget的值,而target則只包含事件的實際目標。若是直接將事件處理程序指定給了目標元素,則this、currentTarget和target包含相同的值。來看下面的例子:對象

1 var btn = document.getElementById("myBtn");
2 btn.onclick = function (event) {
3     alert(event.currentTarget === this); //ture
4     alert(event.target === this); //ture
5 };

這個例子檢測了currentTarget和target與this的值。因爲click事件的目標是按鈕,一次這三個值是相等的。若是事件處理程序存在於按鈕的父節點中,那麼這些值是不相同的。再看下面的例子:

1 document.body.onclick = function (event) {
2     alert(event.currentTarget === document.body); //ture
3     alert(this === document.body); //ture
4     alert(event.target === document.getElementById("myBtn")); //ture
5 };

當單擊這個例子中的按鈕時,this和currentTarget都等於document.body,由於事件處理程序是註冊到這個元素的。然而,target元素卻等於按鈕元素,覺得它是click事件真正的目標。因爲按鈕上並無註冊事件處理程序,結果click事件就冒泡到了document.body,在那裏事件才獲得了處理。

在須要經過一個函數處理多個事件時,可使用type屬性。例如:

 1 var btn = document.getElementById("myBtn");
 2 var handler = function (event) {
 3         switch (event.type) {
 4         case "click":
 5             alert("Clicked");
 6             break;
 7         case "mouseover":
 8             event.target.style.backgroundColor = "red";
 9             bread;
10         case "mouseout":
11             event.target.style.backgroundColor = "";
12             break;
13         }
14     };
15 btn.onclick = handler;
16 btn.onmouseover = handler;
17 btn.onmouseout = handler;

若是對本文有任何意見和建議,歡迎留言,有錯誤請指出,謝謝!!!

相關文章
相關標籤/搜索