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