2012-02-09 5 views
7

Sono stanco di scrivere jQuery, quindi decido di imparare qualche JavaScript raw. Qualcosa in attachEvent di IE mi ha confuso. Ecco il codice.Cosa c'è 'this' in IE's attachEvent

var btn = document.getElementById('myBtn'); 

btn.onclick = function(){ 
    alert(window.event.srcElement === this); //true, I know why. 
}; 

btn.attachEvent('onclick', function(event){ 
    alert(event.srcElement === this); //fasle, but why? 
}); 

provo ad usare IE built-in strumenti di debug, ma mi ha appena detto che 'questo' è un oggetto, ma niente di più ... quindi qual è 'questo' in attachEvent di IE?

+0

provare a inviare 'questo' alla console e vedere. usa 'console.log (this)' – Joseph

+0

Ci provo, ma IE mi ha appena detto che è un oggetto, niente di più. – shawjia

+1

hai individuato l'errore "srcElemnt"? Senza la "e" la proprietà dell'evento sarà indefinita (e! == questo). – Bergi

risposta

7

Da un gestore di eventi vincolato dal metodo IE-specifico attachEvent, this riferisce alla window oggetto globale:

btn.attachEvent('onclick', function(event) { 
    alert(this === window); // true 
} 

Al contrario, all'interno di un gestore di eventi vincolato dal metodo standard addEventListener, this riferisce al Elemento DOM da cui è stato attivato il gestore eventi.

0

questo è un riferimento al contesto e fa riferimento alla finestra quando si verifica l'evento click, poiché questo è l'unico contesto esistente in quel momento.

0

Penso che U errore ortografico una sola parola.



    btn.attachEvent('onclick', function(event){ 
      alert(event.**srcElement** === this); 
    }); 

E ho provato la funzione corrispondente addEventListener in cromo e FF, entrambi restituito true.

IE fa restituisce falso. Forse perché IE si occupa di btn.onclick = fn; e btn.attachEvent() in modo diverso. IE passa il valore globale (finestra) al metodo btn.attachEvent(). È possibile testare questa === finestra, restituisce true.

Qualche commento a riguardo?

+0

corretto. ancora falso. – shawjia