js中如何在不影响既有事件监听的前提下新增监听器

一. 需求澄清

比如某个按钮已经绑定了2-3个对Window对象的load事件的监听,现在需要添加一个新的对click事件的监听器,但在一定条件下才会同时触发原有的2-3个load监听器,否则只触发新添加的这个事件。

假定新添加的监听函数为:

function additionalListener(){
    console.log(‘should do something else‘);
}

二. ES5方法

ES5中可以通过添加包装函数的方式来实现:

_windowonload = window.onload;
window.onload = function(){
    additionalListener();
    if (someCondition){
        _windowonload();
    }
}

三. ES6方法

ES6中添加的代理对象Proxy也可以用来实现这个需求,基本逻辑就是实现了对window.onload的调用劫持:

 var onloadProxy = new Proxy(window.onload,{
    apply:function () {
        additionalListener();
        Reflect.apply(...arguments);
    }
  });
  window.onload = onloadProxy;

四. AOP方法

AOP,即面向切面编程,从元编程的角度来实现链式调用(建议一般编程人员不要在原生对象上添加新特性),实现的逻辑就是在函数的原型对象上添加after方法,它接收一个函数作为参数,在函数被调用时先调用原函数,再调用after方法传入的方法,最后返回原函数的执行结果:

  Function.prototype.after = function (afterFn) {
      return () => {
         const result = this.apply(this, arguments);
          afterFn.apply(this,arguments);
          return result;
      }
  }
  window.onload = window.onload.after(additionalListener);

原文地址:https://www.cnblogs.com/dashnowords/p/9593946.html

时间: 2024-10-08 18:18:20

js中如何在不影响既有事件监听的前提下新增监听器的相关文章

JS中的事件监听与事件流

事件监听: 使用监听器(eventListener)来预定事件,在传统软件工程中称成为观察者模式 执行某种操作时(特定的交互瞬间),会产生对象,对象会沿事件流的方向传播. 事件流: 事件流有两种顺序,事件捕获流以及事件冒泡流 事件捕获是从大到小,事件冒泡是从小到大. <html> <body> <div> <a></a> </div> </body> </html> 如果你点了div,事件冒泡流的顺序就是div

简单剖析Node中的事件监听机制(一)

使用js的class类简单的实现一个事件监听机制,不同于浏览器中的时间绑定与监听,类似于node中的时间监听,并且会在接下来的文章中去根据自己的理解去写一下Event模块中的原理. Node.js使用了一个事件驱动.非阻塞式I/O的模型,使其轻量又高效.并且Node中的大量模块都使用了Event机制,因此可以说是整个Node中最重要的模块之一. 实例: let event = new eventEmitter(); event.on('someType',function(){ }); even

JS 中的事件绑定、事件监听、事件委托

事件绑定 要想让 JavaScript 对用户的操作作出响应,首先要对 DOM 元素绑定事件处理函数.所谓事件处理函数,就是处理用户操作的函数,不同的操作对应不同的名称. 在JavaScript中,有三种常用的绑定事件的方法: 在DOM元素中直接绑定: 在JavaScript代码中绑定: 绑定事件监听函数. 在DOM中直接绑定事件 我们可以在DOM元素上绑定onclick.onmouseover.onmouseout.onmousedown.onmouseup.ondblclick.onkeyd

JS之事件监听

一 如果事件监听类似于如下写法,则最终只会执行最后一个事件监听,其他监听都会被覆盖掉. window.onload=funtion(){console.log(1);}; window.onload=funtion(){console.log(2);}; window.onload=funtion(){console.log(3);}; //最终只会输出:"3" 二 如果事件监听类似于如下写法,则每个事件监听都会被执行,其他监听都不会被覆盖掉. --是否冒泡或捕获都不会影响输出结果的次

js事件监听机制(事件捕获)总结

在前端开发过程中我们经常会遇到给页面元素添加事件的问题,添加事件的js方法也很多,有直接加到页面结构上的,有使用一些js事件监听的方法,由于各个浏览器对事件冒泡事件监听的机制不同,le浏览器只有事件冒泡,没有事件监听的机制,对于事件监听的兼容性问题是最大的难题: 1.直接把事件的方法写在页面结构上 function eventfun(){ //console.log(this); } <input type="button" onclick="eventfun()&qu

Node.js 教程 05 - EventEmitter(事件监听/发射器 )

目录: 前言 Node.js事件驱动介绍 Node.js事件 注册并发射自定义Node.js事件 EventEmitter介绍 EventEmitter常用的API error事件 继承EventEmitter 前言: 今天事儿太多了,没有发太多的东西.不好意思了各位. 本篇主要介绍Node.js中的事件驱动,至于Node.js事件概念的东西,太多了. 本系列课程主要抱着的理念就是,让大家慢慢的入门,我也尽量写的简单一点. 所以呢,本文事件驱动,大家的目标应该是:理解Node.js的事件驱动.会

前端基本知识(四):JS的异步模式:1、回调函数;2、事件监听;3、观察者模式;4、promise对象

JavaScript语言将任务的执行模式可以分成两种:同步(Synchronous)和异步(Asychronous). “同步模式”就是一个任务完成之后,后边跟着一个任务接着执行:程序的执行顺序和排列顺序是一直的:”异步模式”则完全不同,每一个任务都有一个或者多个回调函数(callback),前一个任务结束的时候,不是执行下一个任务,二十执行回调函数,后一个任务则是不等前一个任务结束就执行,所以程序的执行顺序与任务顺序不一致的,异步的. 在浏览器端,耗时时间长的操作都应该异步执行,避免浏览器数去

[JS]笔记12之事件机制--事件冒泡和捕获--事件监听--阻止事件传播

-->事件冒泡和捕获-->事件监听-->阻止事件传播 一.事件冒泡和捕获 1.概念:当给子元素和父元素定义了相同的事件,比如都定义了onclick事件,点击子元素时,父元素的onclick事件也会被触发.js里称这种事件连续发生的机制为事件冒泡或者事件捕获.IE浏览器:事件从里向外发生,事件从最精确对象(target)开始触发,然后到最不精确的对象(document)触发,即事件冒泡 Netscape:事件从外向里发生,事件从最不精确的对象(document)开始触发,然后到最精确对象(

Ext JS 5的声明式事件监听

原文:Declarative Listeners in Ext JS 5 在前文<在Ext JS 5使用ViewControllers>中,简单的介绍了Ext JS 5的一项重要改进--声明式事件监听.在本文,将深度探讨如何使用声明式事件监听啦简化应用程序的视图并减少自定义组件的样板代码. 注意:文章假设你使用的是Ext JS 5.0.1或更高版本. 什么是声明式事件监听? 所谓的"声明式事件监听",就是指定义在类主体中的监听或在实例的配置对象中使用了listeners配置