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

开篇导读:在js中接触了内置的事件监听器,比如我们绑定了按钮的一个点击事件及赋予它一个事件处理函数,当点击按钮时便触发了这个内置监听器也就是onclick,于是开始执行我们赋予它的处理函数,由此我们会想到这种事件监听器我们自己可不可以定义呢?其实我们可以模拟内置事件的监听和触发过程,以此来达到我们需要的效果,在行业领域当中,它被称为观察者模式,直接上实现代码

//定义一个对象
let ObserverMode = {
        //定义添加自定义事件
        on: function(){
            // 判断参数是否满足条件,不满足则返回"参数错误"
            if(!arguments || arguments.length < 2) return this.warningMessages.info1;

            // 取到第一个参数作为自定义事件名
            let observes = arguments[0];

            // 判断第一个参数类型是否符合整数或字符串,不满足则返回"第一个参数不符合字符或数值类型"
            if(!this.isFistType(observes)) return this.warningMessages.info2;

            // 取到第二个参数作为自定义事件处理函数
            let fn = arguments[1];

            // 判断第二个参数类型,不满足则返回"第二个参数不是函数"
            if(!this.isSecondType(fn)) return this.warningMessages.info3;

            // 如果当前对象中不存在handler对象,也可以称为事件管理者,则创建对象
            if(!this.handler) this.handler = {};

            //如果事件管理者中不存在需要自定义事件的名称列表,则新建一个数组列表
            if(!this.handler[observes]) this.handler[observes] = [];

            //在对应的自定义事件名称列表新增这个事件处理函数
            this.handler[observes].push(fn);
        },
        // 触发自定义事件
        emit: function (){
            // 取到事件名
            let observes = arguments[0];
            //取到参数
            let params = arguments[1];
            // 如果传入的事件名未注册或列表为空则返回"没有注册该事件"
            if(!this.handler[observes] || !this.handler[observes].length) return this.warningMessages.info4;
            //否则执行这个事件名称列表中的每个函数
            else this.handler[observes].forEach(item =>{
                item(params);
            })
        },
        // 移除自定义事件
        off: function(){
            // 判断参数是否满足条件,不满足则返回"参数错误"
            if(!arguments || !arguments.length) return this.warningMessages.info1;

            // 取到事件名
            let observes = arguments[0];

            //如果参数长度大于零和第一个参数不符合类型则返回"第一个参数不符合字符或数值类型"
            if(arguments.length > 0 && !this.isFistType(observes)) return this.warningMessages.info2;

            //如果参数长度等于1和事件管理者中存在该事件名称则移除对应列表,不满足则打印"没有注册该事件"
            if(arguments.length == 1){
                if(Object.keys(this.handler).indexOf(observes) > -1){
                    delete this.handler[observes];return;
                }
                else return this.warningMessages.info4;
            }

            //取到参数
            let fn = arguments[1];
            //如果参数长度大于1和第二个参数不符合类型则返回"第二个参数不是函数"
            if(arguments.length > 1 && !this.isSecondType(fn)) return this.warningMessages.info3;
            else {
                // 判断事件列表中是否存在指定的事件处理函数
                let index = this.handler[observes].indexOf(fn);
                //存在则移除对应的事件处理函数,否则打印"该事件列表没有找到对应的执行函数"
                index > -1?this.handler[observes].splice(index,1):console.log(this.warningMessages.info5);
            }
        },
        // 判断第一个参数类型是否符合整数或字符串的方法
        isFistType: function(value){
            let type = typeof value;
            return (type == ‘number‘) || (type == ‘string‘);
        },
        // 判断第二个参数类型
        isSecondType: function(value){
            return value.prototype && (value.__proto__ === Function.prototype)
        },
        //提示数据
        warningMessages: {
            info1: "参数错误",
            info2: "第一个参数不符合字符或数值类型",
            info3: "第二个参数不是函数",
            info4: "没有注册该事件",
            info5: "该事件列表没有找到对应的执行函数",
        }
}

到此自定义的事件就实现了,上面代码的功能和内置事件不同的是,它需要我们手动调用对象中的emit触发,内置事件的每个事件名称只对应一个执行函数,这里的自定义事件是一个事件列表,可以同时处理多个同名事件函数

原文地址:https://www.cnblogs.com/denghaopositive/p/12678651.html

时间: 2024-10-11 18:21:31

观察者模式(自定义事件)的相关文章

观察者模式(2)--自定义事件

[附加题] 请实现下面的自定义事件 Event 对象的接口,功能见注释(测试1) 该 Event 对象的接口需要能被其他对象拓展复用(测试2) // 测试1 Event.on('test', function (result) { console.log(result); }); Event.on('test', function () { console.log('test'); }); Event.emit('test', 'hello world'); // 输出 'hello world

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

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

观察者模式 -&gt; dom事件 / 自定义事件 / Promise 我的理解

观察者模式(Observer) 又称作为发布-订阅模式或消息机制,定义了一种依赖关系,解决了主体对象与观察者对象之间通讯和耦合的问题; 观察者模式例子 引用于<JavaScript设计模式> var Observer = (function(){ var _messages = {}; // 监听信息容器 return { /** * 注册监听信息接口 * @param {String} type 监听信息类型 * @param {Function} fn 对应的回调函数 */ regist:

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

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

JavaScript使用自定义事件实现简单的模块化开发

WEB前端最常见驱动方式就是事件了, 所有交互等等都是通过事件,前端的常见事件有: UI事件: 焦点事件: 鼠标事件: 滚轮事件: 文本事件: 键盘事件: 变动事件: 现在网页上有一个输入框, 如果我们要对用户输入的字符串进行过滤, 或者是截获用户的输入进行处理的话, 我们要肿么办 同学们纷纷举手说:“老师,我知道,是使用添加事件“, 老师也很欣慰地点了点头, 这群家伙真的是越来越聪明了, 老师又问了”如果要取消用户的输入怎么办了“, 坐在最前排眼睛最小的同学急忙说”ev.preventDefa

js自定义事件的实现探索

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

Javascript之自定义事件

Javascript自定义事件,其本质就是观察者模式(又称订阅/发布模式),它的好处就是将绑定事件和触发事件相互隔离开,并且可以动态的添加.删除事件. 下面通过实例,一步一步构建一个具体的Javascript自定义事件对象. 如:我有一个action1函数,我想每次在执行完action1后,触发另一个函数service1,那么代码我们可以这么写: //服务service1 function service1(){ } //函数action1 function action1(){ //other

创建自定义事件

为什么要自定义事件,自定义事件要使用在地方? 传统的事件不能满足我们的需求,所以我们需要自定义事件,比如传统的事件有单击,双击,但是突然某一天我想要三击 那就要用到自定义事件了,自定义事件一般使用在观察者模式上,比如主体需要发布各种消息通过创建各种自定义事件来实现,对于消息的订阅则通过注册监听器来实现. var test = document.getElementById("longen"); // 创建事件 var evt = document.createEvent('Event'

由自定义事件到双向绑定

前言 除了大家经常提到的自定义事件之外,浏览器本身也支持我们自定义事件,我们常说的自定义事件一般也都是用于项目中的一些通知机制,例如双向绑定.一起看一下如何实现自定义事件,以及基于观察者模式的双向绑定的基本原理. 浏览器自定义事件 定义 除了我们常见的click,touch等事件之外,浏览器支持我们定义和分发自定义事件. 创建也十分简单: //创建名为test的自定义事件 var event = new Event('test') //如果是需要更多参数可以这样 var event = new