1. 程式人生 > >探討e.target與e.currentTarget

探討e.target與e.currentTarget

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

<!DOCTYPE html>
<html>
<head>
    <title>Example</title>
</head>
<body>
    <div id="A">
        <div id="B">
        </div>
    </div>
</body>
</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時:輸出:

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

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

當點選B時:輸出:

1 <div id="B"></div>

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

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

由於要相容IE瀏覽器,所以一般都在冒泡階段來處理事件,此時target和currentTarget有些情況下是不一樣的。

如:

function(e){
    var target = e.target || e.srcElement;//相容ie7,8
    if(target){
        zIndex = $(target).zIndex();
    }
}

//往上追查呼叫處 enterprise.on(img,'click',enterprise.help.showHelp);

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

再來證實一下猜測,在IE瀏覽器下執行以下程式碼:

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

物件this、currentTarget和target 

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

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

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

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

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

在需要通過一個函式處理多個事件時,可以使用type屬性。例如:

var btn = document.getElementById("myBtn");
var handler = function (event) {
        switch (event.type) {
        case "click":
            alert("Clicked");
            break;
        case "mouseover":
            event.target.style.backgroundColor = "red";
            bread;
        case "mouseout":
            event.target.style.backgroundColor = "";
            break;
        }
    };
btn.onclick = handler;
btn.onmouseover = handler;
btn.onmouseout = handler;

感謝閱讀,希望能幫助到大家!