问题: 每次单击div.a时,单击div.b时的回调数,累计为1.
var $=jQuery;
$(function(){
$("div.a").click(function(){cbf(trgmsg);});
});
function trgmsg(){
alert($.now());
}
function cbf(cb){
$("div.b").click(function(){cb()});
}
结果:
单击div.a一次,然后单击div.b => alert()弹出;
如果我再次单击div.a并单击div.b => alert()连续弹出两次;
如果我再点击div.a并点击div.b => alert()连续弹出三次;
..等等
我不知道问题的原因是什么,或者它只是我对JS中的回调函数的误解/误用。任何见解和/或建议将不胜感激。感谢
答案 0 :(得分:1)
没有重构的代码的最快修复就是取消绑定并重新绑定。
var $=jQuery;
$(function(){
$("div.a").click(function(){cbf(trgmsg);});
});
function trgmsg(){
alert($.now());
}
function cbf(cb){
$("div.b").off('click').click(function(){cb()});
}
答案 1 :(得分:0)
你现在拥有的(重构的)如下:
(function($){
$(function(){
function trgmsg(){
alert($.now());
}
$('div.a').click(function(){
// every time `div.a` is clicked a new click event is
// attached to `div.b`.
$('div.b').click(function(){ // maybe use `.one()` instead of `.click()`?
cb();
});
});
});
})(jQuery);
你可能想要使用.one()
所以在绑定后它只执行一次。或者你需要详细说明实际的目标是什么,看看能否以不同的方式解决。
答案 2 :(得分:0)
如果您只是想针对div.b
调用提供的功能,当点击div.a
时,这可能适用于您
var $=jQuery;
$(function(){
$("div.a").click(function(){cbf(trgmsg);});
});
function trgmsg(){
alert($.now());
}
function cbf(cb){
$("div.b")[0].apply(cb);
}
答案 3 :(得分:0)
您正在将多个点击事件附加到div.b.因此,每次单击div.a时,它会将另一个单击事件附加到div.b上,因此当单击div.b时,会触发每个单击事件。您可以尝试设置一个标记,表示已经注册了一个点击。
var $=jQuery;
var flag = 0;
$(function(){
$("div.a").click(function(){cbf(trgmsg);});
});
function trgmsg(){
alert($.now());
}
function cbf(cb){
if (!flag) {
flag = 1;
$("div.b").click(function(){cb()});
}
}
虽然我不太确定你使用它是什么,所以可能不是你想要的功能。