jQuery回调函数累积

jQuery callback function accumulating

我为自定义确认框编写了一些代码,该确认框在按下确认按钮(是按钮)时调用一个函数并将另一个函数作为参数传递,我将它绑定到 2 个不同的按钮点击,使用不同的函数作为参数.例如:

$('#button1').click(function() {
    callFunction(function() { alert("test"); });
});
$('#button2').click(function() {
    callFunction(function() { alert("test2"); });
});

function callFunction(callback) {
    //code to display custom confirm box

    console.log(callback);

    $('.confirm-box .yes-button').click(function() {
        callback();
    });
}

一切都按预期进行,确认框出现,点击确认按钮时我执行了一个回调函数,它会提醒 "test"(或 "test2",具体取决于调用确认框的按钮)。当我单击发送警报 "test" 的函数的按钮 1 时,问题出现了功能。现在,一旦我按下是按钮而不是仅提醒 "test2",我就会同时收到 "test2" 和 "test" 提醒,即使 console.log 我只记录了提醒 "test2" 的函数=17=] 在按钮 2 单击时。这些回调函数似乎堆积在某个地方,但我不明白在哪里以及为什么。

您可以通过 类、

设置身份来实现
var button = $('.confirm-box .yes-button');

$('#button1').click(function() {
  button.removeClass("b").addClass("a");
});

$('#button2').click(function() {
  button.removeClass("a").addClass("b");
});

button.click(function() {
  if($(this).hasClass("a")){
     callBackForButton1();
  } else {
     callBackForButton2();
  }
});

堆叠单个元素的事件处理程序是一种不好的做法。

.click() 函数可以向一个元素添加多个处理程序,我认为这就是这里发生的情况。试试这个:

// ...
$('.confirm-box .yes-button').unbind('click').click(function() {
    callback();
});

这会在应用新的点击处理程序之前删除所有以前的点击处理程序。

当你执行代码时:

$('.confirm-box .yes-button').click(function() {
    callback();
});

您正在将事件处理程序绑定到 .yes-button 元素。如果您 运行 该代码两次,它将绑定两个事件。等等。

一个解决方案是改用 .one,这样事件处理程序将在第一次触发后被删除:

$('.confirm-box .yes-button').one("click", function() {
    callback();
});

如果有两个确认框同时打开或者如果有两个 .yes-button 元素,这当然会有问题,但对于一个简单的用例,它工作正常。

发生的情况是每次单击按钮时都会执行 callFunction 方法。它运行该代码块并将事件侦听器应用于 $('.confirm-box .yes-button') 按钮。所以点击你的按钮 N 次也会应用点击监听器 N 次。一种解决方案是将函数存储在变量中。

不确定最终目标是什么,但这是一个解决方案。 另一种解决方案是每次都删除按钮事件侦听器。

var functionToCallOnYes = function() {};

$('#button1').click(function() {
  functionToCallOnYes = function() {
    alert("test");
  };

});

$('#button2').click(function() {
  functionToCallOnYes = function() {
    alert("test2");
  };
});


$('.confirm-box .yes-button').click(function() {
  console.log(functionToCallOnYes);
  functionToCallOnYes();
});

是的,额外的回调越来越多。在$('button1').click(f)中,每次点击button1时都会调用无参数函数f。在这种情况下,fcallFunction-- 每次调用时,它本身都会将新处理程序附加到任何 .confirm-box .yes-button 元素的函数。所以在第 N 次点击时,您应该有 N-1 个警报。

为了简化此类操作,您可以在 JavaScript 中按名称引用函数。所以如果你有 function test() { console.log("test"); };,你可以只写一次 $(".confirm-box").click(test),然后每次点击 .confirm-box 都会在控制台上打印 test

通常,如果您的回调的唯一目的是调用回调,您只需删除该回调即可。