好吧,我有一个视口分为两半,顶部和底部。上半部分有总是可见的组合框和输入字段,下半部分有一个带有多个标签的标签面板。
当我更改上半部分中的一个静态组合框时,我将其称为组合框A
,它会触发一个事件,并在其事件处理程序中A_handler
,它将尝试在其中一个标签中设置另一个组合框的样式,我将其称为组合框B
,但它可以执行以下两种操作之一。
组合框B
显示在标签2
上,而不是1
。
那么:
1)如果标签1
处于活动状态,它会设置一个事件处理程序,以便在标签B
处于活动状态时设置组合框2
的样式。
2)否则,它会立即为它设置样式。
这就是问题所在:初始组合框A
可以将组合框B
设置为两种可能的方式之一,具体取决于选择,例如red
和blue
。
想象一下标签1
可见的情况,我选择样式B
为red
的选项,然后为标签2
创建事件处理程序被激活了。但是,如果不激活标签2
,我会在组合A
中再次更改该选项,以将B
框设为blue
。
此时,我需要它来移除第一个事件处理程序,以便只触发一个。
我没有对事件处理程序的引用,但我已经命名了它们。
我已创建函数来获取选项卡2
上的事件侦听器列表,并知道要删除的侦听器的名称,因此我可以匹配名称,但是当我尝试删除时范围不同他们使用标签removeListener
,所以没有任何反应。
答案 0 :(得分:0)
您可以将事件处理程序设置为仅运行一次:
someItem.on('event', function() {
// ... bla bla bla ...
}, scope, {single:true});
答案 1 :(得分:0)
<强>解决
最终找到了解决方案。
un
或removeListener
功能设置如下:
un( eventName, fn, [scope] )
我的问题是我没有引用传递给fn
的特定处理程序
解决方案涉及通过使用fn名称搜索来查找fn
ref。
因此,在创建事件侦听器时,会使用名称
进行设置 myTab.on('activate', function 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;
},
如果返回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;
},
另一个警告是,必须使用传入的相同作用域创建和删除侦听器,尽管它在API中列为[optional],因此传入此工作正常