如何停止jquery回调函数?

如何停止jquery回调函数?,jquery,function,callback,Jquery,Function,Callback,我有两个html元素:A和B,以下是jquery代码: $('A').click(function(){ $('B').click(function(){ console.log("hello"); }) }) 当我点击A,然后点击B,它会显示“你好”,这很好。 但当我再次点击A,然后点击B,这一次它会显示两个“你好”,这是不可取的。我只想打个招呼 我或多或少知道原因,这可能是回调函数的结果:B在第一次单击后仍在等待用户单击它 现在我的问题是:如果我仍然想在“点

我有两个html元素:A和B,以下是jquery代码:

$('A').click(function(){
    $('B').click(function(){
        console.log("hello");
    })
})
当我点击A,然后点击B,它会显示“你好”,这很好。 但当我再次点击A,然后点击B,这一次它会显示两个“你好”,这是不可取的。我只想打个招呼

我或多或少知道原因,这可能是回调函数的结果:B在第一次单击后仍在等待用户单击它

现在我的问题是:如果我仍然想在“点击A”中“点击B”(“点击B”是“点击A”的回调函数),我如何解决双重结果问题


我是新来的回调函数,请帮忙

您当前的代码与您认为的不完全一样。每次单击
A
,它都会向
B
添加一个新的单击处理程序。因此,如果您单击
A
3次,则在
B
上有3个单击处理程序,所有这些处理程序都在单击B时执行

一种修复方法是将内部的Bs click handler注销为click handler,例如:

$('A').click(function(){
    // Ensure we only ever have one click-handler on B
    // by clearing existing handlers before adding our
    // new one.
    $('B').unbind('click').click(function(){
        console.log("hello");
    })
})
但是,此代码的副作用是删除所有
B
s处理程序,这可能是您不想要的。更健壮的版本(只删除特定处理程序)是创建命名处理程序,而不是匿名处理程序,并添加和删除该处理程序。这允许您以所需的特定处理程序为目标。您还可以使用名称空间(请参阅和查找“名称空间”的文档)


您还可以创建一个布尔值来检查是否单击了

例如:


问题是,每次连续单击
A
都会将另一个单击处理程序添加到
B
。当您单击
B
时,这些处理程序中的每一个都会被执行。因此,如果您单击
A
十次,您已经将十个ClickHandler绑定到
B
:-D

为了避免其他解决方案、常量取消绑定和重新绑定以及全局变量的问题,请使用此干净的解决方案:

$('A').one("click", function(){
    $('B').click(function(){
        console.log("hello");
    })
})
通过使用而不是单击,只会触发
A
上的单击事件一次,将一次单击事件处理程序绑定到元素
B


有效但丑陋的解决方案。说真的,你不想每次单击都取消并重新绑定Eventhandler吗?@Christoph我能想到的另一个解决方案是使用全局变量,这就更不漂亮了!编辑,我刚刚注意到Bondye也提供了这种方法:)确定吗?看看我的答案;)谢谢你的回答,似乎有一种更简单的方法来解决这个问题,(解决方案3),他的解决方案有缺陷吗?非常感谢,它似乎比其他解决方案简单得多,但解决方案有缺陷吗?@webberpuma,在重新阅读您的声明后,我有以下问题:用户在单击A一次后是否只能单击B一次?或者,一旦他点击了A,他可以随意点击B吗?
var aIsClicked = false; //boolean

$('#A').click(function(){
   $('#log').html('clicked on A');
   aIsClicked = true;
});

$('#B').click(function(){
   if(aIsClicked) //check if a was clicked
   {
       $('#log').html('clicked on B and A was clicked');
       alert("hello");
   }
    else
    {
        $('#log').html('clicked on B and A was not clicked');
    }
});​
$('A').one("click", function(){
    $('B').click(function(){
        console.log("hello");
    })
})