Event

事件对象

/**
 * @example
 *     1, var a = new Event();
 *         a.on('login', function(data){});
 *         a.trigger('login').trigger('login', {});
 *         a.off('login');
 *     2, var b = new Event(),c = function(){}
 *         a.on('test', c); 
 *         a.off('test', c);
 */

(function(){
    'use strict';


    var prototype;

    /**
     * 构造函数
     */
    function Event(){
        this.__listener = {};//事件空间
    }

    /**
     * 原型链
     */
    prototype = Event.prototype;


    /**
     * 触发事件
     * @param {string|object} type 事件名或者this指针
     * @param {array} data 触发时附带的数据
     * @return {boolean} 回调里是否有return false
     */
    prototype.trigger = function(type, data){
        var self = this,
            obj = self,
            listeners,
            i = 0;

        //如果不是str则说明要改变this指针
        if('string' !== typeof(type)){
            obj = type;
            type = data;
            data = arguments[2];
        }

        listeners = self.__getListener(type);

        for (;i < listeners.length; i++) {
            if(listeners[i].callback.apply(obj, data || []) === false){
                return false;
            }
            if(listeners[i].one){
                listeners.splice(i--, 1);
            }
        }

        return true;
    }


    /**
     * 添加事件
     * @param   {String}    事件类型
     * @param   {Function}  监听函数
     * @return {object} self
     */
    prototype.on = function(type, callback){
        var self = this;
        self.__getListener(type).push({
            one: false,
            callback: callback
        });
        return self;
    }


    /**
     * 绑定一次事件
     * @param  {string}   type     事件类型
     * @param  {Function} callback 监听函数
     * @return {object}            self
     */
    prototype.one = function(type, callback){
        var self = this;
        self.__getListener(type).push({
            callback: callback,
            one: true
        });
        return self;
    }


    /**
     * 获取事件队列
     * @param  {string} type 事件名
     * @return {array}      事件队列
     */
    prototype.__getListener = function(type) {
        var listener = this.__listener;
        if (!listener[type]) {
            listener[type] = [];
        }
        return listener[type];
    }



    /**
     * 删除事件
     * @param   {String}    事件类型
     * @param   {Function|undefined}  监听函数,如果为空则卸载全部type的事件
     * @return {object} self
     */
    prototype.off = function(type, callback) {
        var self = this,
            listeners = self.__getListener(type),
            i;

        if ('function' === typeof callback) {
            for (i = 0; i < listeners.length; i++) {
                if (callback === listeners[i].callback) {
                    listeners.splice(i--, 1);
                }
            }
        } else {
            listeners.length = 0;
        }

        return self;
    }


    window.Event = Event;
})();
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值