日期:2014-05-16  浏览次数:20421 次

javascript自定义事件管理
?/**
 * 回调函数机制
 * 支持多个回调函数绑定
 * @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