Atlas脚本框架下为控件重复添加和绑定事件处理函数

可以用_evnets对象。Atlas为每个被绑定了Dom事件的Dom元素添加了一个私有属性_events对象。在你的例子中,_events[”click”]是一个对象数组,每个元素有2个属性,例如:
$get(’clickControl’)._events[”click”][0]={handler:A,browserHandler:(内容省略……)}
其中browserHandler是为了处理浏览器兼容性问题而定义的一个function,是实际被绑定的EventHandler,对于不同的浏览器browserHandler会有所不同,有兴趣可以去看看源码。这样的话就可以通过看$get(’clickControl’)._events[”click”]数组中是否有元素的handler属性为B来判断B是否被绑定了……好像有点绕口-_-!不过应该能理解了吧……
当然,还有一个办法就是自己给被绑定了Dom事件的Dom元素添加一个属性,用来记录绑定了那些事件和处理函数……

这是网友dudu关于我的问题的回答,很感谢.
我想最后我还是选择了同你的第2种方法.

我是这样写的
     Sys.UI.seachControl = function Sys$UI$seachControl(
     element,
     )
     {
         /// <param name="element" domElement="true"></param>    
        var e = Function._validateParams(arguments, [{name: "element", domElement: true} ]);
         if (e) throw e;

         if (typeof(element.control) != 'undefined') throw Error.invalidOperation(Sys.Res.controlAlreadyDefined);
         Sys.UI.seachControl.initializeBase(this,[element]);

         this._element = element;
         element.control = this;

         this._oldDisplayMode = this._element.style.display;
         if (!this._oldDisplayMode || (this._oldDisplayMode == 'none')) {
             this._oldDisplayMode = '';
         }

         this.is_bind_click = false;
         this.is_bind_mouseover = false;
         this.is_bind_mouseout = false; 
        
         this.$addSelectHandler = function(Ele,evt,handler,bind)
         {
             switch(evt)
             {  
                 case "click":
                 if(!this.is_bind_click)
                 {
                     $addHandler(Ele,evt,handler)
                     this.is_bind_click = bind ;
                 }
                 break;
                 case "mouseover":
                 if(!this.is_bind_mouseover)
                 {
                     $addHandler(Ele,evt,handler)
                     this.is_bind_mouseover = bind ;
                 }
                 break;
                 case "mouseout":
                 if(!this.is_bind_mouseout)
                 {
                     $addHandler(Ele,evt,handler)
                     this.is_bind_mouseout = bind ;
                 }
                 break; 
             }
         }
         this.$removeSelectHandler = function(Ele,evt,handler,bind)
         {
             switch(evt)
             {  
                 case "click":
                 if(this.is_bind_click)
                 {
                     $removeHandler(Ele,evt,handler)
                     this.is_bind_click = bind ;

                
                 }
                 break;
                 case "mouseover":
                 if(this.is_bind_mouseover)
                 {
                     $removeHandler(Ele,evt,handler)
                     this.is_bind_mouseover = bind ;
                 }
                 break;
                 case "mouseout":
                 if(this.is_bind_mouseout)
                 {
                     $removeHandler(Ele,evt,handler)
                     this.is_bind_mouseout = bind ;
                 }
                 break; 
             }
         }       
    } 
    Sys.UI.seachControl.registerClass('Sys.UI.seachControl', Sys.UI.Control); 

于是,就可以用它给事件添加处理函数和注销处理函数,不用担心会给一个事件添加添加同名的处理函数,引起混乱了.呵呵
_events属性来自于继承的Component类的get_events获得一个EventHandlerList对象
在EventHandlerList中有_getEvent(id)//id应该大概是事件类型//的方法,这返回应该是个一维数组了吧.
 可是我注意到,EventHandlerList类还有一个getHandler(id)的方法将会得到下面的处理函数代码字符串
function(source, args) {
                for (var i = 0, l = evt.length; i < l; i++) {
                    evt[i](source, args);
                }
            };
如果这样写
    var handler = this._events.getHandler("click");
   handler(source, args);
才能使这个处理函数立即执行.但我不知道sourc和eargs参数应该传递什么才对.
从这里也说明了,如果使用得到的EventHandlerList对象的addHandler(id,handler)和removeHandler(id,handler)方法添加与删除事件处理函数就不象Sys.UI.DomEvent.addHandler(Element,event,handler)和Sys.UI.DomEvent.removeHandler(Element,event,handler),即$addHandler(Element,event,handler)和$removeHandlerElement,event,handler)一样是添加的处理函数执行.
甚至,说如果不能用   
var handler = this._events.getHandler("click");
   handler(source, args);
这个事件处理函数永远不会被执行一样.

不晓得大家怎么看,另外source, args两个参数传什么? 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值