javascript - 如何覆盖 event.pageX 等事件属性 setter ?

标签 javascript

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

最佳答案

据我所知,您无法覆盖此 native 属性。您可以构建自己的 getter:

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 ,因此它不能被覆盖。

关于javascript - 如何覆盖 event.pageX 等事件属性 setter ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24605814/

相关文章:

javascript - 使用 Javascript 将行添加到 HTML 表并保存在本地驱动器上

javascript - 通过 axios 使用 vuex 获取文章 ID

javascript - 无法在 PHPStorm 8 中调试 javascript

javascript - 替换相同的类 div 并且没有 ID

javascript - Ant Design - 如何在过滤后获取表格行数?

javascript - 使用 AngularJS 和嵌套在数组中的数组中的 JSON 对象,如何将数据获取到 html 中?

javascript - 如何使用查找查询从 mongoDB 获取数据时获取别名

javascript - onload 处理程序和 src 集的顺序在脚本元素中是否重要?

javascript - d3.behavior.zoom 禁用双击行为

javascript - 使用标志启动时,Docker SIGTERM 未传送到 node.js/coffee 应用程序