如何停止jquery回调函数?
我有两个html元素:A和B,以下是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在第一次单击后仍在等待用户单击它 现在我的问题是:如果我仍然想在“点
$('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");
})
})