在事件监听器中执行未定义的回调是否可以?

时间:2017-03-24 15:26:03

标签: javascript jquery html dom-events

我正在编写一个代码,该代码在单击一组元素时执行函数。它有一个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。似乎是使用它的确切情况。

4 个答案:

答案 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(); });

现在当myCallbackundefined时,您会收到错误消息,说明它不是函数。您可以为其分配一个空函数,而不是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不会出错。