2013-02-14 15 views
6

Es gibt eine JS Fiddle here, können Sie e.target ohne Klonen zu einem neuen Objekt ersetzen?Ersetzen/Überschreiben/Überschreiben e.target in einem JavaScript-Ereignis

Die Zuhörer von dieser Geige sind unten wiederholt;

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') 
    })); 
}); 

Antwort

4

Ich habe Ihre Geige (http://jsfiddle.net/8AQM9/33/) aktualisiert, wie Sie sagten, event.target nur lesbar ist, aber wir können die Eigenschaftendeskriptor mit Object.create überschrieben.

Sie waren auf dem richtigen Weg, aber Object.create recive nicht nur die key: value hashmap, recives es key: property-descriptor Sie at MDN sehen können, wie ein Eigenschaftendeskriptor ist.

habe ich

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

Mit

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

ersetzt Und dies wird e Prototyp und die target Eigenschaft des neuen Objekts ändern.

+0

Tolle Arbeit, danke! –

+1

Funktioniert nicht in Chrome 51. Alle Eigenschaften außer dem Ziel des neuen Ereignisobjekts lauten '[Ausnahme: TypeError: Illegaler Aufruf bei MouseEvent.remoteFunction (: 3: 14)]' –

Verwandte Themen