日期:2014-05-16 浏览次数:20421 次
?/** * 回调函数机制 * 支持多个回调函数绑定 * @author tangbin * @see http://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