我正在编写一个代码,该代码在单击一组元素时执行函数。它有一个revalidate函数。在窗口大小调整时触发此revalidate函数。它会检查调整大小后是否未满足某些条件,然后单击正文时不应执行任何操作。这是一个过于简化的版本。代码:
show registrations
我知道我可以使用jquery var myFunction = function() {
// do something
}
var myCallback = myFunction;
$(".myClass").on("click", myCallback);
$(window).resize(function(){
if(//certain conditions are met) {
myCallback = undefined;
}
else {
myCallback = myFunction
}
});
来分离处理程序。但实际的代码更复杂。它是一个像代码的插件,如果我点击事件绑定在插件定义内的某些条件。如果我使用off
然后再次使用off
,我可能需要再次运行整个插件代码;这超出了On
功能的目的。所以,
在事件监听器中执行未定义的回调是否可以?
P.S:我一直在读revalidate
。似乎是使用它的确切情况。
答案 0 :(得分:4)
您的代码不会调用未定义的函数,因为变量myCallback
仅在绑定事件处理程序时进行评估,而不是每次事件发生时进行评估。要问你提出的问题,必须是以下代码:
$(".myClass").on("click", function(e) {
myCallback.call(this, e);
});
当myCallback
设置为未定义时,会收到错误,抱怨undefined
没有属性call
。你应该写的是:
$(".myClass").on("click", function(e) {
if (myCallback) {
myCallback.call(this, e);
}
});
答案 1 :(得分:1)
当你这样做时,
$(".myClass").on("click", myCallback);
发送对myCallback
函数的引用。重新分配时,发送给on
函数的回调(引用)将不会更改。
你可能想做的就是这样的事情
$(".myClass").on("click", function(){ myCallback(); });
现在当myCallback
为undefined
时,您会收到错误消息,说明它不是函数。您可以为其分配一个空函数,而不是undefined
:
myCallback = function(){};
或者,您可以检查click
处理程序中的条件:
var condition = true;
var myFunction = function() {
if( !condition )
return;
// do something
}
$(".myClass").on("click", myFunction);
$(window).resize(function(){
if(//certain conditions are met) {
condition = false;
}
else {
condition = true;
}
});
答案 2 :(得分:1)
您尝试的方式无法正常工作,因为您没有物理传递回调,只是指向它的指针。这样做
master
不清除回调,只是更改指向未定义变量的指针。在更改指针之前,jQuery会保存有关回调的信息。这就是为什么它不起作用。
考虑重构:
myCallback = undefined;
在这种情况下,我们在调整大小期间更改监护变量,并在我们的单击处理程序中对其进行检查。在这种情况下,您不必打开/关闭回调处理程序。
答案 3 :(得分:-1)
它肯定不是漂亮的代码,并且应该采取措施让其他开发人员(或者未来你)明白这个回调可能不会在以后回调,但是jQuery的.on方法不会尝试运行任何等同于(认为==
)为false的东西。
因此,将回调设置为undefined不会出错。