var create: function() {
    return function() {
      this.initialize.apply(this, arguments);
    }
}
}


var ElementListener = Class.create();
ElementListener.prototype = {

   
    initialize : function()
    {
        this._listenerInfo = function(expression, bubbling)
                            {
                                this.Expression = expression;
                                this.Bubbling = bubbling;
                            };
        this._listenerList = function (element, type)
                            {
                                this.Element = element;
                                this.Type = type;
                                this.ListenerInfo = [];
                            };
        this._listenerHash = [];
       
        this._addListener = function (element, type, expression, bubbling)
        {
            bubbling = bubbling || false;
            if(window.addEventListener)
            { // Standard  
                element.addEventListener(type, expression, bubbling);  
                return true;
            }
            else if(window.attachEvent)
            { // IE  
                element.attachEvent('on' + type, expression);  
                return true;
            }
            else return false;
        };
       
        this._removeListener = function (element, type, expression, bubbling)
        {
            bubbling = bubbling || false;
            if(window.removeEventListener)
            { // Standard  
                element.removeEventListener(type, expression, bubbling);  
                return true;
            }
            else if(window.detachEvent)
            { // IE  
                element.detachEvent('on' + type, expression);  
                return true;
            }
            else return false;
        };
    },
  
   
    addListener : function(element, type, expression, bubbling)
    {
        for (var i = 0; i < this._listenerHash.length; i++)
        {
            var listener = this._listenerHash[i];
            if(listener.Element == element && listener.Type == type)
            {
                if (this._addListener(element, type, expression, bubbling))
                {
                    listener.ListenerInfo[listener.ListenerInfo.length] = new this._listenerInfo(expression, bubbling);
                }
                return;
            }
        }
       
        if (this._addListener(element, type, expression, bubbling))
        {
            var listenerList = new this._listenerList(element, type);
            listenerList.ListenerInfo[listenerList.ListenerInfo.length] = new this._listenerInfo(expression, bubbling);
            this._listenerHash[this._listenerHash.length] = listenerList;
        }
    },
   
    removeListener : function(element, type, expression, isRefFunction)
    {
        for (var i = 0; i < this._listenerHash.length; i++)
        {
            var listener = this._listenerHash[i];
            if(listener.Element == element && listener.Type == type)
            {
                if(expression != null && arguments.length >= 3)
                {
                    for (var j = 0; j < listener.ListenerInfo.length; j++)
                    {
                        var listenerInfo = listener.ListenerInfo[j];
                        if (isRefFunction)
                        {
                            if(listenerInfo.Expression == expression)
                            {
                                if (this._removeListener(element, type, listenerInfo.Expression, listenerInfo.Bubbling))
                                {
                                    listener.ListenerInfo.splice(j, 1);
                                    j--;
                                }
                            }
                        }
                        else
                        {
                            if(listenerInfo.Expression.toString() == expression.toString())
                            {
                                if (this._removeListener(element, type, listenerInfo.Expression, listenerInfo.Bubbling))
                                {
                                    listener.ListenerInfo.splice(j, 1);
                                    j--;
                                }
                            }
                        }
                    }
                }
                else
                {
                    for (var j = 0; j < listener.ListenerInfo.length; j++)
                    {
                        var listenerInfo = listener.ListenerInfo[j];
                        if (this._removeListener(element, type, listenerInfo.Expression, listenerInfo.Bubbling))
                        {
                            listener.ListenerInfo.splice(j, 1);
                            j--;
                        }
                    }
                }
                if (listener.ListenerInfo.length == 0)
                {
                    this._listenerHash.splice(i, 1);
                    i--;
                }
            }
        }
    }
};

posted on 2008-04-28 10:23  大斌锅  阅读(513)  评论(0)    收藏  举报