克隆javascript事件对象

pau*_*ith 9 javascript

有人知道如何深入复制/克隆本机javascript事件对象吗?我知道我可以创建一个新的事件对象并手动设置适当的属性以匹配原始事件,但如果有一种方法可以克隆,那就容易多了.

kof*_*fus 10

上面的代码不会正确复制任何getter/setter.尝试:

function cloneEvent(e) {
    if (e===undefined || e===null) return undefined;
    function ClonedEvent() {};  
    let clone=new ClonedEvent();
    for (let p in e) {
        let d=Object.getOwnPropertyDescriptor(e, p);
        if (d && (d.get || d.set)) Object.defineProperty(clone, p, d); else clone[p] = e[p];
    }
    Object.setPrototypeOf(clone, e);
    return clone;
}
Run Code Online (Sandbox Code Playgroud)


Eri*_*pen 9

为了您的目的,我只是将它作为新对象构造函数的原型并覆盖您想要更改的对象.由于循环引用问题,JS中的克隆变得混乱,因此它可能不是您希望的快速和肮脏的解决方案.

function cloneEventObj(eventObj, overrideObj){

   if(!overrideObj){ overrideObj = {}; }

   function EventCloneFactory(overProps){
       for(var x in overProps){
           this[x] = overProps[x];
       }
    }

    EventCloneFactory.prototype = eventObj;

    return new EventCloneFactory(overrideObj);

}

//So add your override properties via an object
$el.click(function(e){
    var newEventObj = cloneEventObj(
        e,
        { target:document.body }
    );
    doSomething(newEventObj);
});

//or just stick 'em on manually after spitting the object out
/*...
var newEventObj = cloneEventObj(e);
newEventObj.target = document.body
...*/
Run Code Online (Sandbox Code Playgroud)

在这种情况下,"克隆"对象是新对象的原型对象.'这个.' 在原型对象之前检查属性,以便这些属性将覆盖.或者您可以在构建对象后附加属性.

  • 这在具有只读属性的 Chrome 中不起作用: `function Event() {} Event.prototype = event; var ev = new Event(); console.log(ev.currentTarget);` 产生“TypeError:非法调用”。必须直接在原始事件对象上访问这些属性。 (4认同)
  • 我只是尝试使用粘贴事件,它不起作用. (2认同)