2013-02-14 17 views
6

C'è un JS Fiddle here, puoi sostituire e.target senza clonare un nuovo oggetto?Sostituisci/Sostituisci/Sovrascrivi e.target in un evento JavaScript

Gli ascoltatori di quel violino sono ripetuti in basso;

one.addEventListener('click', function(e) { 
    // default behaviour, don't modify the event at all 
    logTarget(e); 
}); 

two.addEventListener('click', function(e) { 
    // replace the value on the same object, which seems to be read-only 
    e.target = document.createElement('p'); 
    logTarget(e); 
}); 

three.addEventListener('click', function(e) { 
    function F(target) { 
    // set another property of the same name on an instance object 
    // which sits in front of our event 
    this.target = target; 
    } 
    // put the original object behind it on the prototype 
    F.prototype = e; 
    logTarget(new F(document.createElement('p'))); 
}); 

four.addEventListener('click', function(e) { 
    // create a new object with the event behind it on the prototype and 
    // our new value on the instance 
    logTarget(Object.create(e, { 
    target: document.createElement('p') 
    })); 
}); 

risposta

4

Ho aggiornato il vostro violino (http://jsfiddle.net/8AQM9/33/), come hai detto, event.target è di sola lettura, ma possiamo sovrascrivere il descrittore di proprietà con Object.create.

Tu eri sulla strada giusta, ma Object.create non recive solo il key: value HashMap, si vengono accolte key: property-descriptor si può vedere at MDN come un descrittore di proprietà è.

Ho sostituito

Object.create(e, { 
    target: document.createElement('p') 
}); 

Con

Object.create(e, { 
    target: { 
     value: document.createElement('p') 
    } 
}); 

e questo prototipo e e modificare la proprietà target del nuovo oggetto.

+0

Ottimo lavoro, grazie! –

+1

Non funziona in Chrome 51. Tutte le proprietà tranne la destinazione del nuovo oggetto evento leggono '[Eccezione: TypeError: invocazione illegale su MouseEvent.remoteFunction (: 3: 14)]' –