写一个addEventListener以及removeEventListener

第一步:对象属性赋值为函数,对象内部函数控制年龄这一参数变化,同时成长事件也执行。

  class Person{
        constructor(){
            this.name = ‘‘;
            this.age = 0;
            this.growup()//不断成长
            this.growEvent = null//成长经历的事情
        }
        setName(val){
            this.name = val
        }
        growup(){
            let _this = this;
            setInterval(()=>{
                _this.age++;
                if(_this.growEvent instanceof Function){//判断是不是函数
                    _this.growEvent()
                }
            },100)
        }

    }
    let hx = new Person()
    hx.setName(‘韩信‘)
    hx.growEvent = function(){
        if(this.age == 18){
            console.log(‘开始参军啦‘)
        }
    }

继续思考:成长事件只能接受一个函数,那么如果是多个函数呢?韩信要打仗,要建功立业的呀。可以很快的想到growEvent换成数组来接受多个函数。

那么,growEvent就要靠Push进数组了,而不是粗暴的赋值了。成长事件执行的时候也不再是上门的_this.growEvent,而是循环了。

  class Person{
    	constructor(){
    		this.name = ‘‘;
    		this.age = 0;
    		this.growup()//不断成长
    		this.growEvent = []//需要接受多个函数
    	}
    	setName(val){
    		this.name = val
    	}
    	growup(){
    		let _this = this;
    		setInterval(()=>{
    			_this.age++;
    			_this.growEvent.forEach(cb=>{
    				if(cb instanceof Function){
    					cb.call(this)//需要注意更改this指向,不然指向window
    				}
    			})
    		},100)
    	}

    }
    let hx = new Person()
    hx.setName(‘韩信‘)
    hx.growEvent.push(function(){
    	if(this.age == 18){
    		console.log(‘开始参军啦‘)
    	}
    })
    hx.growEvent.push(function(){
    	if(this.age == 20){
    		console.log(‘当上小队长啦‘)
    	}
    })

上面的这种方式成长事件采用直接Push的方式看着好像有点辣眼睛,那么我们可以添加一个addEventListener方法来帮我们Push

class Person{
        constructor(){
            this.name = ‘‘;
            this.age = 0;
            this.growup()//不断成长
            this.growEvent = []//需要接受多个函数
        }
        setName(val){
            this.name = val
        }
        growup(){
            let _this = this;
            setInterval(()=>{
                _this.age++;
                _this.growEvent.forEach(cb=>{
                    if(cb instanceof Function){
                        cb.call(this)//需要注意更改this指向,不然指向window
                    }
                })
            },100)
        }
        addEventListener(cb){
            if(cb instanceof Function){
                this.growEvent.push(cb)
            }
        }

    }
    let hx = new Person()
    hx.setName(‘韩信‘)
    hx.addEventListener(function(){
        if(this.age == 18){
            console.log(‘开始参军啦‘)
        }
    })
    hx.addEventListener(function(){
        if(this.age == 20){
            console.log(‘当上小队长啦‘)
        }
    })

写到了这里看上去好像有点那啥的样子了。那么,假设成长事件需要一个名字呢?比如,hx,addEventListener("marry",funciton(){})

那我们就需要继续对growEvent继续改装,改成对象形式,每个属性的属性值都是一个数组。

在Push事件,以及执行事件的时候也要更改一下。

class Person{
        constructor(){
            this.name = ‘‘;
            this.age = 0;
            this.growup()//不断成长
            this.growEvent = {}//需要接受多个函数
        }
        setName(val){
            this.name = val
        }
        growup(){
            let _this = this;
            setInterval(()=>{
                _this.age++;
                for(let i in _this.growEvent){
                    if(_this.growEvent[i] && _this.growEvent[i] instanceof Array){
                        _this.growEvent[i].forEach(cb=>{
                            if(cb instanceof Function){
                                cb.call(this)//需要注意更改this指向,不然指向window
                            }
                        })
                    }
                }

            },100)
        }
        addEventListener(name,cb){
            if(name && cb instanceof Function){
                if(this.growEvent[name]){
                    this.growEvent[name].push(cb)
                }else{
                    this.growEvent[name] = []
                    this.growEvent[name].push(cb)
                }
            }
        }

    }
    let hx = new Person()
    hx.setName(‘韩信‘)
    hx.addEventListener(‘army‘,function(){
        if(this.age == 18){
            console.log(‘开始参军啦‘)
        }
    })
    hx.addEventListener(‘lead‘,function(){
        if(this.age == 20){
            console.log(‘当上小队长啦‘)
        }
    })
    hx.addEventListener(‘lead‘,function(){
        if(this.age == 25){
            console.log(‘当上大队长啦‘)
        }
    })

那么接下来要做的是如何removeEventListener 呢?一种方式是粗暴的直接清空数组,把多个事件同时清除。

class Person{
        constructor(){
            this.name = ‘‘;
            this.age = 0;
            this.growup()//不断成长
            this.growEvent = {}//需要接受多个函数
        }
        setName(val){
            this.name = val
        }
        growup(){
            let _this = this;
            setInterval(()=>{
                _this.age++;
                for(let i in _this.growEvent){
                    if(_this.growEvent[i] && _this.growEvent[i] instanceof Array){
                        _this.growEvent[i].forEach(cb=>{
                            if(cb instanceof Function){
                                cb.call(this)//需要注意更改this指向,不然指向window
                            }
                        })
                    }
                }

            },100)
        }
        addEventListener(name,cb){
            if(name && cb instanceof Function){
                if(this.growEvent[name]){
                    this.growEvent[name].push(cb)
                }else{
                    this.growEvent[name] = []
                    this.growEvent[name].push(cb)
                }
            }
        }
        removeEventListener(name){
            if(name && this.growEvent.hasOwnProperty(name)){
                this.growEvent[name] = []
            }
        }
    }
    let hx = new Person()
    hx.setName(‘韩信‘)
    hx.addEventListener(‘army‘,function(){
        if(this.age == 18){
            console.log(‘开始参军啦‘)
        }
    })
    hx.addEventListener(‘lead‘,function(){
        if(this.age == 20){
            console.log(‘当上小队长啦‘)
        }
    })
    hx.addEventListener(‘lead‘,function(){
        if(this.age == 25){
            console.log(‘当上大队长啦‘)
        }
    })
    hx.removeEventListener(‘army‘);

上面这样的话,韩信就不会开始参军了,直接当小队长起步。

但是这样做的话还是有点不好,包括js里的原生事件也是,移除监听的时候,是需要函数名称的。具名函数无论是在回调还是递归里都非常有用。

class Person{
        constructor(){
            this.name = ‘‘;
            this.age = 0;
            this.growup()//不断成长
            this.growEvent = {}//需要接受多个函数
        }
        setName(val){
            this.name = val
        }
        growup(){
            let _this = this;
            setInterval(()=>{
                _this.age++;
                for(let i in _this.growEvent){
                    if(_this.growEvent[i] && _this.growEvent[i] instanceof Array){
                        _this.growEvent[i].forEach(cb=>{
                            if(cb instanceof Function){
                                cb.call(this)//需要注意更改this指向,不然指向window
                            }
                        })
                    }
                }

            },100)
        }
        addEventListener(name,cb){
            if(name && cb instanceof Function){
                if(this.growEvent[name]){
                    this.growEvent[name].push(cb)
                }else{
                    this.growEvent[name] = []
                    this.growEvent[name].push(cb)
                }
            }
        }
        removeEventListener(name,cbName){
            if(name && this.growEvent.hasOwnProperty(name)){
                this.growEvent[name] = this.growEvent[name].filter(cb=>{
                    return cb != cbName
                })
            }
        }
    }
    let hx = new Person()
    hx.setName(‘韩信‘)
    hx.addEventListener(‘army‘,function(){
        if(this.age == 18){
            console.log(‘开始参军啦‘)
        }
    })
    hx.addEventListener(‘lead‘,fn)
    function fn(){
        if(this.age == 20){
            console.log(‘当上小队长啦‘)
        }
    }
    hx.addEventListener(‘lead‘,function(){
        if(this.age == 25){
            console.log(‘当上大队长啦‘)
        }
    })
    hx.removeEventListener(‘lead‘,fn);

这样的话,韩信就没有当小队长这个过程啦!

原文地址:https://www.cnblogs.com/hjj2ldq/p/9418602.html

时间: 2024-10-10 21:02:32

写一个addEventListener以及removeEventListener的相关文章

如何写一个跨浏览器的事件处理程序 js

如何 写一个合格的事件处理程序,看如下代码: EventUtil可以直接拿去用 不谢 <!DOCTYPE html> <html> <head> <title> </title> </head> <body> <input type="button" name="ids" id="ids" value="value"> <sc

事件监听addEventListener()和removeEventListener() ---------1

一直想写一个原生事件监听的记录,方便以后看,不愿意写主要是事件监听的单词太长,记起来好难记每次都要查,这次把知道的写完了,来这里查好了,以后要是理解的更透彻了,就再补全好了 首先,DOM0级事件和DOM2级事件 给一个元素添加事件有三种方法 HTML <input type="button" value='button1' id='btn1' /><input type="button" value='button2' id='btn2' />

addEventListener()与removeEventListener(),追加事件和删除追加事件

addEventListener()与removeEventListener()用于追加事件和删除追加.所有的DOM节点中都包含这两种方法,并且它们都接受3个参数:要处理的事件名.作为事件处理程序的函数和一个布尔值. 最后这个布尔值参数是true,表示在捕获阶段调用事件处理程序:如果是false,表示在冒泡阶段调用事件处理程序.默认为false; 要在按钮上为click事件添加事件处理程序,可以使用下列代码: ```var btn = document.getElementById("myBtn

为PhoneGap写一个android插件

为PhoneGap写一个android插件,要怎么做? 其实这句话应该反过来说,为android写一个PhoneGap插件,要怎么做? 这里以最简单的Hello World!为例,做个说明: 1.第一步,要先建立一个支持PhoneGap(Cordova)的android工程 因为这个插件本质上是安卓插件,用于PhoneGap,因此,要二者支持才行,所以我们要建立一个支持PhoneGap(Cordova)的android工程,插件在这个工程里面编写. 扫盲:PhoneGap现在已经出售给了Apac

addEventListener()和removeEventListener()

作用: addEventListener()与removeEventListener()用于处理指定和删除事件处理程序操作. 它们都接受3个参数:事件名.事件处理的函数和布尔值. 布尔值参数是true,表示在捕获阶段调用事件处理程序:如果是false,表示在冒泡阶段调用事件处理程序. 示例: 环境:移动端,界面禁止触摸事件 要在body上添加事件处理程序,可以使用下列代码: document.body.addEventListener('touchmove', function (event)

分享:计算机图形学期末作业!!利用WebGL的第三方库three.js写一个简单的网页版“我的世界小游戏”

这几天一直在忙着期末考试,所以一直没有更新我的博客,今天刚把我的期末作业完成了,心情澎湃,所以晚上不管怎么样,我也要写一篇博客纪念一下我上课都没有听,还是通过强大的度娘完成了我的作业的经历.(当然作业不是百度来的,我只是百度了一些示例代码的意思,怎么用!算了,越解释万一越黑呢!哈哈O(∩_∩)O哈哈~) ----------------------------------------------------------------分界线------------------------------

一、addeventlistener 与 removeeventlistener

事件流:事件捕获,事件处理,事件冒泡 addEventListener()与removeEventListener()用于处理指定事件和删除事件处理程序.所有的DOM节点中都包含这两种方法,并且它们都接受3个参数:要处理的事件名.作为事件处理程序的函数和一个布尔值.这个布尔值参数是true,表示在捕获阶段调用事件处理程序:如果是false,表示在冒泡阶段调用事件处理程序.// 添加事件 addHanlder: function (element, type, hanlder) { if (ele

addEventListener()与removeEventListener()

addEventListener()与removeEventListener()用于处理指定和删除事件处理程序操作.所有的DOM节点中都包含这两种方法,并且它们都接受3个参数:要处理的事件名.作为事件处理程序的函数和一个布尔值.最有这个布尔值参数是true,表示在捕获阶段调用事件处理程序:如果是false,表示在冒泡阶段调用事件处理程序. 要在按钮上为click事件添加事件处理程序,可以使用下列代码: var btn = document.getElementById("myBtn")

js高级程序设计笔记之-addEventListener()与removeEventListener(),事件解除与绑定

js高级程序设计笔记之-addEventListener()与removeEventListener(),事件解除与绑定 addEventListener()与removeEventListener()用于处理指定和删除事件处理程序操作.所有的DOM节点中都包含这两种方法,并且它们都接受3个参数:要处理的事件名.作为事件处理程序的函数和一个布尔值.最有这个布尔值参数是true,表示在捕获阶段调用事件处理程序:如果是false,表示在冒泡阶段调用事件处理程序. 要在按钮上为click事件添加事件处