微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

有没有办法覆盖事件对象并做我喜欢的事情?

如何解决有没有办法覆盖事件对象并做我喜欢的事情?

我知道有一种方法可以更改可以从全局范围访问的对象的功能。例如,可以使用以下代码覆盖 window.alert 以通过 window.confirm 使用:

var olDalert = window.alert;
window.alert = function(string) {
    var promise = olDalert(string);
    window.confirm(string)
    return promise;
}

所以我想知道是否可以将事件对象(即 event.preventDefault() )重写为不同的东西。例如,如果我有多个地方必须同时执行 event.preventDefault()event.stopPropagation();,并且我可以重写 event.preventDefault() 来执行这两个操作,那么这将很有帮助。但是,事件对象只能通过本地范围访问,并且要像我在前面的示例中所做的那样重写事件对象,我需要通过全局范围访问它们。那么,有没有办法在全局范围内覆盖事件对象并使它们做一些不同的事情?谢谢。

解决方法

通过覆盖 Event.prototype.preventDefault 是可能的,但这不是一个好主意:

const nativePreventDefault = Event.prototype.preventDefault;
Event.prototype.preventDefault = function() {
  nativePreventDefault.call(this);
  this.stopPropagation();
};

document.querySelector('#parent').addEventListener('click',() => {
  console.log('parent sees event');
});
document.querySelector('#child').addEventListener('click',(e) => {
  console.log('child calling custom preventDefault');
  e.preventDefault();
});
<div id="parent">
  <div id="child">child</div>
</div>

作为更直观、更安全的替代方法,请考虑将事件作为参数传递给调用这两种方法的函数:

const stop = (event) => {
  event.stopPropagation();
  event.preventDefault();
};

然后就这样做:

stop(event);

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。