如何覆蓋事件屬性?我這樣做的原因是因爲我想在鼠標事件上覆蓋像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);
只讀是按規格,你需要的,如果要忽略可能的干將使用'defineProperty'繼承,setter方法並且對原型中的同名命名屬性是隻讀的。 – Esailija
非常感謝您的支持!我仍然需要做一些測試來找出哪些是最高性能的方式,但是這有助於ALOT。 :) –