如何覆盖事件属性?我这样做的原因是因为我想覆盖pageX
鼠标事件等属性,并且该属性是只读的。
我第一次尝试这个
context.addEventListener(type, function (e) {
var Event;
Event = function () {
this.pageX = pageX;
this.pageY = pageY;
this.preventDefault = function () {
e.preventDefault();
};
this.stopPropagation = function () {
e.stopPropagation();
};
this.stopImmediatePropagation = function () {
e.stopImmediatePropagation();
};
};
Event.prototype = e;
callback.call(context, new Event());
}, false);
不幸的是,这太好了,令人难以置信。它不适用于某些浏览器(至少 Chrome)。pageX
无法设置属性,因为只读状态以某种方式从事件对象继承。
然后我尝试了
context.addEventListener(type, function (e) {
var evt = {},
i;
for (i in e) {
if (e.hasOwnProperty(i)) {
evt[i] = e[i];
}
}
evt.pageX = pageX;
evt.pageY = pageY;
evt.preventDefault = function () {
e.preventDefault();
};
evt.stopPropagation = function () {
e.stopPropagation();
};
evt.stopImmediatePropagation = function () {
e.stopImmediatePropagation();
};
callback.call(context, evt);
}, false);
这个可行,但比第一种方法慢约 100 倍。我真的不想走这条路,否则每次使用它都会感到难过。
我考虑过放弃。我可以像pointX
原始事件一样添加属性并增加pageX
那里的价值。再说一次,如果某些浏览器决定添加属性pointX
并将其设为只读,我的所有代码都会被破坏。
任何建议都将受到欢迎。
更新:感谢 Esailija,现在它可以工作了!我在下面添加解决方案。
document.body.addEventListener('mousedown', function (e) {
var Event = function () {};
Event.prototype = e;
Event = new Event();
Object.defineProperty(Event, 'pageX', {
value: 999
});
console.log(Event);
}, false);