读书人

javascript自定义事件治理

发布时间: 2012-11-23 00:03:43 作者: rapoo

javascript自定义事件管理

?/** * 回调函数机制 * 支持多个回调函数绑定 * @authortangbin * @seehttp://www.planeart.cn/?p=1182 * @namespace */var callback = (function () {var that = this,cache = {},fName = '${callback}',fVal = 1;/** * @scope callback */return {/** * 绑定回调函数 * @example var loadEndFn = function (photoId, photoIndex) { * // [code..] * }; * callback.bind('getData', loadEndFn); * @param{String}名称 * @param{Function}要绑定的回调函数 */bind: function (name, callback) {!cache[name] && (cache[name] = {});!callback[fName] && (callback[fName] = fVal ++);cache[name][callback[fName]] = callback;},/** * 移除回调函数 * @example var loadEndFn = function (photoId, photoIndex) { * // [code..] * }; * callback.unbind('getData', loadEndFn); * @param{String}名称 * @param{Function}要卸载的回调函数 */unbind: function(name, callback) {callback === undefined ?delete cache[name] :callback[fName] && (delete cache[name][callback[fName]]);},/** * 触发回调函数 * @example var photoId = 34356, photoIndex = 0; * callback.trigger('getData', [photoId, photoIndex]); * @param{String}名称 * @param{Array}(可选)传递给事件处理函数的附加参数 */trigger: function (name, data) {var i, ret, callbacks = cache[name];if (callbacks) for (i in callbacks) ret = callbacks[i].apply(that, data);return ret;}};})();

?

?

??? 原文链接:http://www.planeart.cn/?p=1182

?

?

?

??var _cache = {};

    var broadcast = {         /**         * 派发                  * @param  {[type]} type 事件类型         * @param  {[type]} data 回调数据         * @return {[type]}      [description]         */        fire:function(type, data){            var listeners = _cache[type],len = 0;            if(!$.isUndefined(listeners)){                var args = [].slice.call(arguments);                args = args.length > 2 ? args.splice(2, args.length-1) : [];                args = [data].concat(args);                 len = listeners.length;                for(var i = 0; i<len;i++){                    var listener = listeners[i];                    if(listener && listener.callback) {                        args = args.concat(listener.args);                        listener.callback.apply(listener.scope, args);                    }                }            }            return this;        },        /**         * 订阅广播事件         * @param  {[type]}   types     事件类型,支持,分隔符         * @param  {Function} callback 回调函数         * @param  {[type]}   scope    回调函数上下文         * @return {[type]}            this         */        subscribe:function(types, callback, scope){            types = types || [];            var args = [].slice.call(arguments);             if($.isString(types)){                types = types.split(',');            }            var len = types.length;            if(len===0){                return this;            }            args = args.length > 3 ? args.splice(3, args.length-1) : [];            for(var i = 0;i<len;i++){                var type = types[i];                _cache[type] = _cache[type] || [];                _cache[type].push({callback:callback,scope:scope,args:args});            }            return this;        },        /**         * 退订         * @param  {[type]}   type     [description]         * @param  {Function} callback 假如传入则移出传入的监控事件,否则移出全部         * @return {[type]}            [description]         */        unsubscribe:function(type, callback, scope){            var listeners = _cache[type];            if (!listeners) {                return this;            }            if(callback){                var len = listeners.length,                    tmp = [];                 for(var i=0; i<len; i++) {                    var listener = listeners[i];                    if(listener.callback == callback && listener.scope == scope) {                    } else {                        tmp.push(listener);                    }                }                listeners = tmp;            }else{                listeners.length = 0;            }            return this;        },        /**         * 订阅别名         * @return {[type]} [description]         */        on:function(){            return this.subscribe.apply(this,arguments);        },        /**         * 退订别名         * @return {[type]} [description]         */        un:function(){            return this.unsubscribe.apply(this,arguments);        },        dispatch:function(){            return this.fire.apply(this,arguments);        },         removeAll:function(){            _cache = {};            return this;        }    };
?

?

?

读书人网 >JavaScript

热点推荐