有人知道如何深度拷贝/克隆本机JavaScript事件对象吗?我知道可以创建一个新的事件对象,并手动设置适当的属性以匹配原始事件,但如果有一种方法只是克隆,那将会更容易。
有人知道如何深度拷贝/克隆本机JavaScript事件对象吗?我知道可以创建一个新的事件对象,并手动设置适当的属性以匹配原始事件,但如果有一种方法只是克隆,那将会更容易。
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;
}
clone = new Function()
- vsyncif (!e) return;
- vsync对于您的目的,我建议将其作为新对象构造函数的原型,并覆盖您想要更改的部分。由于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
...*/
在这种情况下,“克隆”的对象是新对象的原型对象。在检查原型对象之前,将首先检查“this.”属性,因此这些属性将被覆盖。或者,你可以在构建对象后附加属性。function Event() {} Event.prototype = event; var ev = new Event(); console.log(ev.currentTarget);
会产生“TypeError: Illegal invocation”错误。必须直接在原始事件对象上访问这些属性。 - Jakub Vrána您可以使用类似于Object.assign
的方法,使用代理来构造一个新的事件,而不会修改原始事件
示例:
function EventModifier (evt, obj) {
const proxy = new Proxy(evt, {
get: (target, prop) => obj[prop] || target[prop]
})
return new evt.constructor(evt.type, proxy)
}
onclick = evt => {
evt = new EventModifier(evt, { altKey: true })
// Dispatch the new event on something else
console.log('clicked with alt key:', evt.altKey) // always true
}
这种方式可以使用与原始事件相同的选项,包括冒泡、可取消、键修饰符等(但它不包括任何目标,因为您打算在其他地方分派修改后的事件)。
保留原始事件,但使用Object.defineProperty
覆盖一个键,如果要添加多个,则可以使用defineProperties。
onclick = evt => {
Object.defineProperty(evt, 'target', { value: document.querySelector('script') })
console.log('target:', evt.target)
}
function cloneEvent(type, event) {
var evt = new Event(type);
return Object.setPrototypeOf(evt,event);
}
或者只是
function cloneEvent(event){
return Object.create(event)
}
它返回一个新对象,保护你不编辑原始对象,但允许你读取和编辑属性。这要归功于js原型链
最新的js引擎支持'structuredClone',可以为您完成此操作
new MouseEvent()
。答案链接为:https://dev59.com/qGcs5IYBdhLWcg3wjUuR#32670713 - Andrew