js的自定义事件

js中的事件是js的一大技术点,说白了就是操作dom树的唯一途径。

关于事件无非两种绑定方式:

document.getElementById(‘xxx‘).onclick = function(){

}
document.getElementById("xxx").addEventListener("click", function(){

});

前者和后者的区别无非就是绑定一个和多个,当多次绑定相同元素的时候,前者会覆盖,后者不会覆盖。

下面我们来看看如何自定义事件,我们想的自定义事件无非两点

1.我们可以根据自己传递的自定义事件,绑定我们想要的事件

2.我们绑定的事件不能相互之前覆盖

综上所述,我们可以自己定义函数,函数实现两个参数,第一个参数用来传递我们想要绑定的自定义事件,第二个参数是我们想要运行的函数。但是不相互覆盖我们如何实现呢?我们都知道,我们直接绑定相同元素的相同事件后者一定会覆盖前者的,所以我们思路是定义一个对象

listener:{}

我们定义了一个listener对象,用于把我们所有自定义的事件都添加到这个对象里面,然后当我们调用的时候,在遍历这个对象。

核心思想就是我们把对象的键当作我们的自定义事件的名称,我们的值一定是一个数组,然后我们把所有的自定义事件的函数都push到这个数组里面来时间事件的不覆盖

listener:{
        ‘aa‘:[fn1(),fn2(),fn3()],
        ‘bb‘:[fn5(),fn6()]
}

例如上面的例子就是说我们自定义了五个自定义事件,有三个名字叫aa,功能分别为:

fn1()    fn2()      fn3()

有两个名字叫b,功能分别为:

fn5()     fn6()

这个就是我们实现自定义事件的核心思想,下面我们来写添加自定义事件的push函数

           function addEvent(type,fn){
                if(typeof this.listener[type] ===‘undefined‘){
                    this.listener[type]=[];
                }
                if(typeof fn ===‘function‘){
                    this.listener[type].push(fn);
                }
                return this;
            }

上面这个函数我们所有的添加自定义事件我们都会把这个自定义事件push到我们的listener对象中,来实现自定义事件的预定义。

之后我们定义了这个自定义事件,我们需要一个函数遍历这个listener对象来运行这里面的代码,来时间自定义事件的函数功能。

代码如下:

          function showEvent(type){
                var arr = this.listener[type];
                if(arr instanceof Array){
                    for(var i=0;i<arr.length;i++){
                        if(typeof arr[i] ===‘function‘){
                            arr[i]({type:type});
                        }
                    }
                }
            }

这样我们就可以运行我们定义的某个自定义事件了。

既然有自定义事件,那么我们就一定需要一个删除自定义事件的函数,代码如下:

      function removeEvent(type, fn) {
                var arrayEvent = this.listener[type];
                if (typeof type === "string" && arrayEvent instanceof Array) {
                    if (typeof fn === "function") {
                        for (var i=0, length=arrayEvent.length; i<length; i+=1){
                            if (arrayEvent[i] === fn){
                                this.listener[type].splice(i, 1);
                                break;
                            }
                        }
                    } else {
                        delete this.listener[type];
                    }
                }
                return this;
            }

这样子我们就实现了js的自定义事件,我们来整合一下我们的所有代码:

    var Event = {
            listener:{},
            addEvent:function(type,fn){
                if(typeof this.listener[type] ===‘undefined‘){
                    this.listener[type]=[];
                }
                if(typeof fn ===‘function‘){
                    this.listener[type].push(fn);
                }
                return this;
            },
            showEvent:function(type){
                var arr = this.listener[type];
                if(arr instanceof Array){
                    for(var i=0;i<arr.length;i++){
                        if(typeof arr[i] ===‘function‘){
                            arr[i]({type:type});
                        }
                    }
                }
            },
            removeEvent: function(type, fn) {
                var arrayEvent = this.listener[type];
                if (typeof type === "string" && arrayEvent instanceof Array) {
                    if (typeof fn === "function") {
                        for (var i=0, length=arrayEvent.length; i<length; i+=1){
                            if (arrayEvent[i] === fn){
                                this.listener[type].splice(i, 1);
                                break;
                            }
                        }
                    } else {
                        delete this.listener[type];
                    }
                }
                return this;
            }
        };

之后我们在想要自定义事件我们只需要这样调用:

     Event.addEvent(‘aa‘,fn);
        Event.addEvent(‘aa‘,function(){
            alert(456);
        });
        Event.removeEvent(‘aa‘,fn);
时间: 2024-10-05 10:23:45

js的自定义事件的相关文章

js高级技巧----自定义事件

自定义事件 原本的事件处理的原理:事件是javascript与浏览器交互的主要途径. 事件是一种叫做观察者的设计模式 观察者模式由两类对象组成:主体和观察者. 主体用于发布事件: 观察者通过订阅这些事件来观察该主体. 自定义事件的原理: 将事件处理程序保存在一个数组中: 当添加事件的时候,我们push进去这个事件处理函数: 当我们执行的时候,从头遍历这个数组中的每个事件处理函数,并执行. 自定义事件应该具有的内容: 1.一个handler对象,对象中保存着存放事件处理函数的数组 handler 

JS中自定义事件的使用与触发

1. 事件的创建 JS中,最简单的创建事件方法,是使用Event构造器: var myEvent = new Event('event_name'); 但是为了能够传递数据,就需要使用 CustomEvent 构造器: var myEvent = new CustomEvent('event_name', { detail:{ // 将需要传递的数据写在detail中,以便在EventListener中获取 // 数据将会在event.detail中得到 }, }); 2. 事件的监听 JS的E

漫谈js自定义事件、DOM/伪DOM自定义事件

一.说明.引言 我JS还是比较薄弱的,本文的内容属于边学边想边折腾的碎碎念,可能没什么条理,可能有表述不准确的地方,可能内容比较拗口生僻.如果您时间紧迫,或者JS造诣已深,至此您就可以点击右侧广告(木有?则RSS或盗版)然后撤了. 事件是个大课题,真要从断奶开始讲起的话,可以写个12期的连载.关于JS事件的文章(类似DOM/BOM事件模型,IE与其他浏览器事件差异,DOM1/DOM2事件定义等)落叶般随处可见.熟豆子反复炒一点意思都没有,因此,这里谈谈自己感兴趣的自定义事件以及周边. 所谓自定义

js自定义事件、DOM/伪DOM自定义事件

一.说明.引言 我JS还是比较薄弱的,本文的内容属于边学边想边折腾的碎碎念,可能没什么条理,可能有表述不准确的地方,可能内容比较拗口生僻.如果您时间紧迫,或者JS造诣已深,至此您就可以点击右侧广告(木有?则RSS或盗版)然后撤了. 事件是个大课题,真要从断奶开始讲起的话,可以写个12期的连载.关于JS事件的文章(类似DOM/BOM事件模型,IE与其他浏览器事件差异,DOM1/DOM2事件定义等)落叶般随处可见.熟豆子反复炒一点意思都没有,因此,这里谈谈自己感兴趣的自定义事件以及周边. 所谓自定义

js中事件(自定义事件)

今天闲的蛋疼,我们来聊一聊web前端中的事件机制和自定义事件.灵感来自jQuery,在此感谢jQuery作者. 首先,最开始. <button id="button" type="button" onclick="alert('hello')">你好</button> 这是我们在使用html写页面的时候最原生的事件触发方式.上面那行代码会生成一个按钮,当我们点击这个按钮的时候就会弹出一个原生的弹窗,内容是hello. 随着

js自定义事件的实现探索

我们一般所熟悉的事件,都是这样的:onclick,onmouseover,ontouchstart,onfocus... 但这里要讨论自定义事件的实现,包含:事件注册/监听.事件分发. 有两种方式去实现: 自己实现事件管理器:CustomEventManager 使用document.createEvent 先说第一种方式 CustomEventManager的实现 要实现一个完整的事件体系,必须包含2大功能:注册/监听.触发,用伪代码表示: function CustomEventManage

js自定义事件模式

---恢复内容开始--- js事件用的最多的就是默认事件.不过有时候需要自定义事件来使用. 参照默认事件的模式,例如click事件,鼠标点击dom,先触发click事件,然后执行dom上的事件处理程序. <p>点我</p> document.getElementByTagName('p')[0].addEventLisener('click',()=>{ alert('click'); }) 同理,自定义事件也需要三个部分,即事件注册.事件触发.处理程序. 这里使用原型方法做

谈谈JS的观察者模式(自定义事件)

呼呼...前不久参加了一个笔试,里面有一到JS编程题,当时看着题目就蒙圈...后来研究了一下,原来就是所谓的观察者模式.就记下来...^_^ 题目 [附加题] 请实现下面的自定义事件 Event 对象的接口,功能见注释(测试1) 该 Event 对象的接口需要能被其他对象拓展复用(测试2) // 测试1 Event.on('test', function (result) { console.log(result); }); Event.on('test', function () { cons

js事件、自定义dom事件、自定义事件

本文参考资料是:高级编程语言第三版(13章事件和22章自定义事件). 本文涉及到: 事件的组成元素. 事件优化. 模拟事件. 自定义事件的内容 js事件是什么?高级程序13章第一句话说:js与html之间的交互是通过事件实现的.事件是浏览器或者用户自身执行的某种动作,例如我们最常用到的点击事件. 1:js事件 事件流 事件处理程序 事件对象 事件类型 事件流:从页面上接收事件的顺序 事件冒泡:概念事件从最具体的元素接收事件,然后逐级向上传播到较为不具体的元素.这个概念是由ie提出. <!DOCT