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

Javascript/Ajax-从Sys.EventHandlerList()中手动删除事件处理程序,javascript,ajax,event-handling,scriptcontrol,Javascript,Ajax,Event Handling,Scriptcontrol,我有两个脚本控件,一个控制另一个,我已成功地使用以下方法处理来自父级上的子级的事件: initialize: function() { this._autoComplete = $get(this._autoCompleteID); this._onAutoCompleteSelected = Function .createDelegate(this, this.handleAutoCompleteSelected); var autoControl

我有两个脚本控件,一个控制另一个,我已成功地使用以下方法处理来自父级上的子级的事件:

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

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

    var autoControl = this._autoComplete.control;
    autoControl.addItemSelected(this._onAutoCompleteSelected);
    ...
}
其中addItemSelected(在子项上)为:

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);
    }

    ....
}
有更好的方法吗?

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

您是否尝试过使用
$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中的DOM元素。\u autoComplete
您将遍历控件对象本身:

this._autoControl.get_element();
因此,基本上将“get element=>get control object”的逻辑反转为“get control object=>get element”

this._autoControl.get_element();