自定义事件模块引擎

define(function () {
    /**
     * Event listener (singleton)
     */
    // TODO: replace usage of the event listener for the EventBus
    var events = {
        ‘listeners‘: [],

        /**
         * Find a single listener by its object
         * @param {Object} object
         * @return {Number} index  -1 when not found
         */
        ‘indexOf‘: function (object) {
            var listeners = this.listeners;
            for (var i = 0, iMax = this.listeners.length; i < iMax; i++) {
                var listener = listeners[i];
                if (listener && listener.object == object) {
                    return i;
                }
            }
            return -1;
        },

        /**
         * Add an event listener
         * @param {Object} object
         * @param {String} event       The name of an event, for example ‘select‘
         * @param {function} callback  The callback method, called when the
         *                             event takes place
         */
        ‘addListener‘: function (object, event, callback) {
            var index = this.indexOf(object);
            var listener = this.listeners[index];
            if (!listener) {
                listener = {
                    ‘object‘: object,
                    ‘events‘: {}
                };
                this.listeners.push(listener);
            }

            var callbacks = listener.events[event];
            if (!callbacks) {
                callbacks = [];
                listener.events[event] = callbacks;
            }

            // add the callback if it does not yet exist
            if (callbacks.indexOf(callback) == -1) {
                callbacks.push(callback);
            }
        },

        /**
         * Remove an event listener
         * @param {Object} object
         * @param {String} event       The name of an event, for example ‘select‘
         * @param {function} callback  The registered callback method
         */
        ‘removeListener‘: function (object, event, callback) {
            var index = this.indexOf(object);
            var listener = this.listeners[index];
            if (listener) {
                var callbacks = listener.events[event];
                if (callbacks) {
                    index = callbacks.indexOf(callback);
                    if (index != -1) {
                        callbacks.splice(index, 1);
                    }

                    // remove the array when empty
                    if (callbacks.length == 0) {
                        delete listener.events[event];
                    }
                }

                // count the number of registered events. remove listener when empty
                var count = 0;
                var events = listener.events;
                for (var e in events) {
                    if (events.hasOwnProperty(e)) {
                        count++;
                    }
                }
                if (count == 0) {
                    delete this.listeners[index];
                }
            }
        },

        /**
         * Remove all registered event listeners
         */
        ‘removeAllListeners‘: function () {
            this.listeners = [];
        },

        /**
         * Trigger an event. All registered event handlers will be called
         * @param {Object} object
         * @param {String} event
         * @param {Object} properties (optional)
         */
        ‘trigger‘: function (object, event, properties) {
            var index = this.indexOf(object);
            var listener = this.listeners[index];
            if (listener) {
                var callbacks = listener.events[event];
                if (callbacks) {
                    for (var i = 0, iMax = callbacks.length; i < iMax; i++) {
                        callbacks[i](properties);
                    }
                }
            }
        }
    };
    return events;
});

以上是来自visjs的自定义事件模块,不知道为什么他们自己放着没用,看了一下非常实用,所以就直接拿过来用就可以。

时间: 2024-10-23 22:22:32

自定义事件模块引擎的相关文章

【教程】【FLEX】#003 自定义事件、模块间通讯

本篇笔记,主要阐明 事件是如何创建 和 如何使用自定义事件达到模块之间通讯 的效果. 句子解释: 什么叫做模块之间的通讯呢?? 简单点说,就是两个模块之间可以互相传数据. A模块 可以接收到 B模块的数据,这个就叫做通讯. 所以A模块注册了一个事件, B模块触发了这个事件,A接收到. 那么 这个就是A.B模块进行通讯了. 一.自定义事件的创建(代码例子在文章底部) 1.创建一个ActionScript类,继承Event 2.声明属性 2.1  保存数据的属性(事件保存数据的对象,可多个) 2.2

javascript和jquey的自定义事件小结

“通过事件机制,可以将类设计为独立的模块,通过事件对外通信,提高了程序的开发效率.” 可以把多个关联但逻辑复杂的操作利用自定义事件的机制灵活地控制好 对象之间通过直接方法调用来交互 1)对象A直接调用对象B的某个方法,实现交互:直接方法调用本质上也是属于一种特殊的发送与接受消息,它把发送消息和接收消息合并为一个动作完成: 方法调用方和被调用方被紧密耦合在一起:因为发送消息和接收消息是在一个动作内完成,所以无法做到消息的异步发送和接收: 2)对象A生成消息->将消息通知给一个事件消息处理器(Obs

自定义事件解决重复请求BUG

现在,组件化开发还是比较流行的,毕竟其优点相当突出.最近在开发一个组件的时候,遇到了一个很有意思的BUG... BUG的背景 最近在开发一个组件,好不容易开发好了转测试.然后,测试给我提了一个这样的bug,orz... 因为是一个组件,最大的好处就是可以随处复用,随处使用,然而,当一个页面用了多个组件,只有最后一个生效的时候,这个组件就没有什么意义了... BUG原因查找 这个组件的初始数据来源的接口是固定的,也就是说,页面内的所有这个组件在初始化的时候都会发出同样的请求,这里的请求是jsonp

Backbone源码解读(一)事件模块

Backbone源码浅读: 前言: Backbone是早起的js前端MV*框架之一,是一个依赖于underscore和jquery的轻量级框架,虽然underscore中基于字符串拼接的模板引擎相比如今基于dom元素双向绑定的模板引擎已显得落伍,但backbone作为引领前端mv*开发模式的先驱之一,依然是麻雀虽小却设计精妙,了解其设计与结构对于想一探mv*框架的初学者来说仍会获益匪浅. Backbone结构: Backbone分为几个部分:其中最核心的是Event事件模块,提供了实现事件与观察

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

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

Unreal Engine 4 蓝图之自定义事件

UE4的蓝图就跟C++等编程语言在概念上是非常类似的.在蓝图中你可以定义变量.函数.宏等等,高级点的,它还可以被继承.这还不算,我们还可以定义蓝图接口,规范子类的行为.基本上C++中可以做的,蓝图也可以做到,而且是所见即所得,拖拖拽拽,即时编译,立即生效. 一般的做法是,程序员在C++中做好功能模块,关卡设计师,用蓝图创建游戏的逻辑,关卡师不需要会编程.可以自己创建逻辑,至少在逻辑这一层不需要程序员来配合.这样的效率会高很多,而且也没有类似Lua这样的脚本语言参与,设计师的门槛要低很多了. 这里

自定义事件实现不同窗体间的通讯Delphi篇

要实现子窗体与父窗体之间的通讯,有多种方法(比如:重载子窗体的构造函数,将父窗体的引用作为参数传递给子窗体).下面我要介绍的是利用自定义事件的方法,它能够最大程度的避免模块之间的耦合,充分体现面向对象的优点. 先将效果图展示给大家: [[The No.1 Picture.]] 下面是实现代码: Unit2 //子窗体 type //声明自定义事件的类型(类似于C#中的委托) TMyEventHandle = procedure (Sender: TObject; Content: string)

Backbone事件模块源码分析

事件模块Backbone.Events在Backbone中占有十分重要的位置,其他模块Model,Collection,View所有事件模块都依赖它.通过继承Events的方法来实现事件的管理,可以说,它是Backbone的核心组成部分. 此外,事件模块的所有方法都挂在了全局的Backbone上,如果你的代码中需要用到自定义事件(实现观察者模式),可以直接使用它. 所以很有必要一起来研究下Backbone.Events的源码,一来学习Backbone事件模块优秀的写法和思想,二来可以更好的灵活使

Backbone事件模块及其用法

事件模块Backbone.Events在Backbone中占有十分重要的位置,其他模块Model,Collection,View所有事件模块都依赖它.通过继承Events的方法来实现事件的管理,可以说,它是Backbone的核心组成部分. 此外,事件模块的所有方法都挂在了全局的Backbone上,如果你的代码中需要用到自定义事件(实现观察者模式),可以直接使用它. 一.Events API 1.0之前只提供了三个基本方法 on/once/off/trigger,1.0开始增加了几个实用方法 li