In questi giorni mi sono trovato a dover creare un oggetto in javascript con al suo interno oggetti HTML. Andando ad utilizzare funzioni di callback per la gestione di eventi in correlazione a tali oggetti HTML mi sono trovato davanti ad un problema: l'oggetto 'this' all'interno di un metodo di classe, al momento in cui il metodo è richiamato da un evento, non è più un'istanza della classe ma è l'oggetto HTML che fa il trigger dell'evento.
Un codice javascript chiarirà meglio il problema:
function pippo()
{
this.obj=document.createElement("div");
this.obj.onclick=cliccato;
}
pippo.prototype.cliccato = function(evt)
{
// Credevo che l'oggetto 'this' sarebbe stato un'istanza di pippo
alert(this);
// ...invece è il div creato prima!
}
Ho anche trovato online un workaround per questo:
function pippo()
{
this.obj=document.createElement("div");
var me=this;
this.obj.onclick=function(evt)
{
alert(me);
// 'me' in questo caso è l'istanza dell'oggetto
};
}
Ok, la cosa funziona... ma è un workaround! Non sono riuscito a trovare qualcosa inerente a questo problema sul w3c (non ho le capacità per poter interpretare quelle enormi specifiche sul DOM), quindi non so gli standard cosa prevedono. Sta di fatto che non vedo perché 'perdere' il riferimento all'istanza della classe se per riferirsi al target c'è già la proprietà event.currentTarget (standard secondo il w3c).
Grazie a tutti del supporto.