您的位置:首页 > 其它

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

2007-08-02 22:20 585 查看
可以用_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两个参数传什么?
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: