简体   繁体   English

在JavaScript事件中替换/覆盖/覆盖e.target

[英]Replace/Override/Overwrite e.target in a JavaScript Event

There's a JS Fiddle here , can you replace e.target without cloning to a new object? 这里有一个JS小提琴 ,你可以在不克隆到新对象的情况下替换e.target吗?

The listeners from that fiddle are repeated below; 来自那个小提琴的听众在下面重复;

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

I've updated your fiddle ( http://jsfiddle.net/8AQM9/33/ ), as you said, event.target is readonly, but we can overwrite the property descriptor with Object.create . 我已经更新了你的小提琴( http://jsfiddle.net/8AQM9/33/ ),如你所说,event.target是readonly,但我们可以用Object.create覆盖属性描述符。

You were on the right way but Object.create does not recive only the key: value hashmap, it recives key: property-descriptor you can see at MDN how a property descriptor is. 你是在正确的方式,但Object.create不会只返回key: value hashmap,它会重现key: property-descriptor你可以在MDN看到属性描述符是怎样的。

I've replaced 我已经换了

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

With

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

And this will prototype e and modify the target property of the new object. 这将原型e并修改新对象的target属性。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM