Javascript 仅根据组件的函数名-Ext Js从组件中删除事件侦听器
好的,我有一个分为两半的视口,顶部和底部。上半部分有组合框和始终可见的输入字段,下半部分有一个带有多个选项卡的选项卡面板 当我更改上半部分的一个静态组合框时,我将其称为组合框Javascript 仅根据组件的函数名-Ext Js从组件中删除事件侦听器,javascript,extjs,Javascript,Extjs,好的,我有一个分为两半的视口,顶部和底部。上半部分有组合框和始终可见的输入字段,下半部分有一个带有多个选项卡的选项卡面板 当我更改上半部分的一个静态组合框时,我将其称为组合框A,它会触发一个事件,并在其事件处理程序A\u处理程序,它会尝试在其中一个选项卡中设置另一个组合框的样式,我将其称为组合框B,但它可能会执行以下两种操作之一 组合框B在选项卡2上可见,而不是1 那么: 1) 如果tab1处于活动状态,则当tab2处于活动状态时,它将为组合框B设置样式的事件处理程序 2) 否则,它将立即对其进
A
,它会触发一个事件,并在其事件处理程序A\u处理程序
,它会尝试在其中一个选项卡中设置另一个组合框的样式,我将其称为组合框B
,但它可能会执行以下两种操作之一
组合框B
在选项卡2
上可见,而不是1
那么:
1) 如果tab1
处于活动状态,则当tab2
处于活动状态时,它将为组合框B
设置样式的事件处理程序
2) 否则,它将立即对其进行样式化
所以问题来了:初始组合框A
,根据选择,可以设置组合框B
两种可能的方式之一,例如红色
和蓝色
因此,想象一下选项卡1
可见的情况,我选择将B
样式设置为red
,然后在激活选项卡2
时创建事件处理程序。但是,在不激活选项卡2
的情况下,我再次在comboA
中更改选项,使框B
变为蓝色
此时,我需要它删除第一个事件处理程序,以便只触发一个事件处理程序
我没有对事件处理程序的引用,但已将其命名
我创建了一些函数来获取选项卡2
上的事件侦听器列表,并知道要删除的侦听器的名称,因此我可以匹配名称,但当我尝试使用选项卡的removeListener
删除它们时,作用域不同,因此不会发生任何事情。您可以将事件处理程序设置为仅工作一次:
someItem.on('event', function() {
// ... bla bla bla ...
}, scope, {single:true});
已解决
最终找到了解决办法
un
或removeListener
功能的设置如下:
un(eventName,fn,[scope])
我的问题是,我没有要传递给fn
解决方案包括通过搜索fn名称来查找fn
ref
因此,在创建事件侦听器时,将使用以下名称对其进行设置:
myTab.on('activate',函数doSomeStuff(){
稍后当我需要检查它是否存在/可能将其删除时:
objectHasNamedListener: function(obj, eventType, name) {
var listeners = obj.events[eventType].listeners;
//trim functionality since .trim() doesn't exist in old IE
name = name.replace(/^\s+|\s+$/g, '');
if (listeners != undefined) {
for (var i = 0; i < listeners.length; i++) {
var func = listeners[i].fn;
var funcStr = func.toString();
var funcName = funcStr.substr('function'.length);
funcName = funcName.substr(0, funcName.indexOf('('));
funcName = funcName.replace(/^\s+|\s+$/g, '');
if (funcName == name) {
return true;
}
}
}
return false;
},
objectHasNamedListener:函数(obj,eventType,name){
var listeners=obj.events[eventType]。监听器;
//修剪功能,因为旧IE中不存在.trim()
name=name.replace(/^\s+|\s+$/g');
如果(侦听器!=未定义){
for(var i=0;i
如果返回true,则获取对该处理程序的引用:
if (this.objectHasNamedListener(myTab, "activate", "doSomeStuff")) {
var listener = this.getNamedListener(myTab, "activate", "doSomeStuff");
myTab.removeListener("activate", listener, this);
}
getNamedListener: function(obj, eventType, name) {
var listeners = obj.events[eventType].listeners;
name = name.replace(/^\s+|\s+$/g, '');
if (listeners != undefined) {
for (var i = 0; i < listeners.length; i++) {
var func = listeners[i].fn;
var funcStr = func.toString();
var funcName = funcStr.substr('function'.length);
funcName = funcName.substr(0, funcName.indexOf('('));
funcName = funcName.replace(/^\s+|\s+$/g, '');
if (funcName == name) {
return func;
}
}
}
return null;
},
if(this.objectHasNamedListener(myTab,“activate”,“doSomeStuff”)){
var listener=this.getNamedListener(myTab,“激活”,“doSomeStuff”);
myTab.RemovelListener(“激活”,listener,this);
}
getNamedListener:函数(obj、事件类型、名称){
var listeners=obj.events[eventType]。监听器;
name=name.replace(/^\s+|\s+$/g');
如果(侦听器!=未定义){
for(var i=0;i
另一个警告是,必须使用传入的相同范围创建和删除侦听器,尽管它被列为[可选]在API中,传递这个函数很好描述代码如何工作没有太多意义。发布一个测试用例。谢谢,但问题不是事件处理程序持续存在,事实上我已经将它们设置为只触发一次。我的问题是,我需要一种方法在事件处理程序触发onceSo之前删除它,请使用un
方法删除事件。un
方法如下:un(eventName,fn,[scope])
需要引用事件处理程序函数,我无权访问该函数,因此我的标题部分说“…基于其函数名”也许我在文章中解释得不够好。我无法访问处理程序的函数ref,因为所有这些代码本身都在更广泛的事件处理程序中,并且没有任何东西可以持久化-例如,没有附加到全局对象的属性,或者全局varsThanks以获得帮助,但我找到了一个解决方案。它检索funct通过从函数名中进行查找来执行ion ref