/**
* 回调函数机制
* 支持多个回调函数绑定
* @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];
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;
}
};
broadcast.fire('event name', json);
broadcast.on('event name', function(data){
console.log(data);
});