如何覆盖event.pageX等事件属性设置器?

时间:2014-07-07 08:10:55

标签: javascript

我想覆盖所有事件的event.pageX和event.pageY,因为IE10 +有一个错误,有时会返回pageX / Y而不是整数的浮点位置。

1 个答案:

答案 0 :(得分:1)

据我所知,您无法覆盖此本机属性。你可以建立自己的吸气剂:

MouseEvent.prototype.getPageX = function() {
    return Math.ceil(this.pageX);
}

然后使用event.getPageX()代替event.PageX

修改 有一个小实验证明它是不可能的。我做了这个小事件监听器,所以当我点击任何地方时,我可以看到事件的检查实例:

var bod = document.querySelector("body");

bod.addEventListener("click", function(e) {
    console.log(e);
});

然后我尝试更改MouseEvent构造函数。

var M = MouseEvent;
MouseEvent = function() {
    M.apply(this, arguments); // in fact this is not possible
    this.pageX = Math.ceil(this.pageX+15000);
}

现在,当您点击屏幕时,浏览器会做什么?它创建了MouseEvent的新实例。但它并没有在javascript中实现。它用它想要的任何语言来做。因此,new MouseEvent之类的任何内容都不会发生在js中,并且没有地方可以覆盖该新对象的属性。

作为证据,您可以尝试使用以下方式创建新事件:

var evt = new MouseEvent("click", {
    canBubble: true,
    cancelable: true,
    view: window,
  });

它实际上会失败:

M.apply(this, arguments);
// TypeError: Failed to construct 'MouseEvent': Please use the 'new' operator, this DOM object constructor cannot be called as a function.

但我的观点是,简单点击屏幕并没有失败,因为它没有在js中使用new MouseEvent因此无法覆盖。