Javascript / Ajax - 从Sys.EventHandlerList()手动删除事件处理程序

时间:2008-12-31 16:25:28

标签: javascript ajax event-handling scriptcontrol

我有两个脚本控件,一个持有另一个,我已经成功地使用以下方式处理来自父级子节点的事件:

initialize: function() 
{
    this._autoComplete = $get(this._autoCompleteID);

    this._onAutoCompleteSelected = Function
      .createDelegate(this, this.handleAutoCompleteSelected);

    var autoControl = this._autoComplete.control;
    autoControl.addItemSelected(this._onAutoCompleteSelected);
    ...
}

addItemSelected(在孩子上)是:

addItemSelected: function(handler) 
{

    list = this.getEvents();
    list.addHandler('userItemSelected', handler);

},

和getEvents是:

getEvents: function() 
{

    if (this._events == null) 
    {
        this._events = new Sys.EventHandlerList();
    }

    return this._events;
},

问题是,在处理父母时,我想做同样的事情:

dispose: function() 
{
    var autoControl = this._autoComplete.control;
    autoControl.removeItemSelected(this._onAutoCompleteSelected);
    ...
}

但是,.control不再存在。我猜这是因为子控件已被处理,因此.control属性不再起作用。

鉴于此,我决定运行子项上的事件列表并删除其中的所有事件处理程序。

dispose: function() 
{
    list = this.getEvents();
    for(var item in list._list)
    {
        var handler;

        handler = list.getHandler(item);

        list.removeHandler(item, handler);
    }

    ....
}

有更好的方法吗?

1 个答案:

答案 0 :(得分:0)

我不确定DOM元素上的“control”expando属性是引用控件对象的正确方法。它是由框架管理的,正如您所看到的,我认为在您处理此类部署时它已经被提供了。

您是否尝试过使用$find代替$get并以这种方式重新修改参考文件?:

initialize: function() 
{
    this._autoControl = $find(this._autoCompleteID);

    this._onAutoCompleteSelected = Function
      .createDelegate(this, this.handleAutoCompleteSelected);

    this._autoControl.addItemSelected(this._onAutoCompleteSelected);
}

dispose: function() 
{
    this._autoControl.removeItemSelected(this._onAutoCompleteSelected);
    this._autoControl = null;
}

哦,是的,你引用this._autoComplete中存储的DOM元素的地方你改为通过控制对象本身:

this._autoControl.get_element();

所以基本上将“get element => get control object”的逻辑反转为“get control object => get element”。