我有一个附加到各种元素的事件处理程序列表,但我想在某个条件为真时禁用它们的部分。这种情况(即布尔值)会动态变化,并且在变化时无法预测。这是我目前所做的。
function foo () {
if (someCondition) {
return;
}
// foo does something
}
function bar () {
if (someCondition) {
return;
}
// bar does something
}
...etc
这没关系,但在每个函数中使用if块实际上是多余的。有没有更简洁的方法来管理这个?我想知道我是否可以将两个事件处理程序附加到一个元素,并且只有在另一个元素返回true时才执行一个。
答案 0 :(得分:6)
您可以编写一个函数,将函数转换为仅在条件为真时才运行的函数:
function conditionalize( fn ) {
return function() {
if (someCondition) return;
return fn.apply(this, arguments);
};
}
然后:
var foo = conditionalize(function() {
// stuff that foo does
});
答案 1 :(得分:1)
你可以使用像jQuery事件处理方法的委托方法,试试这个:
var callbacks = [foo, bar];
function delegate() { // this is the only event handler
var i, len;
for(i=0, len = callbacks.length; i < len; i++) {
if(callbacks[i].apply(this, arguments)){
continue; // return value of this callback is true then continue
} else {
break; // ignore other callbacks
}
}
}
function foo () {
// foo does something
}
function bar () {
// bar does something
}