javascript jquery回调累积

时间:2013-09-10 17:27:03

标签: javascript jquery callback accumulate

问题: 每次单击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中的回调函数的误解/误用。任何见解和/或建议将不胜感激。感谢

4 个答案:

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

虽然我不太确定你使用它是什么,所以可能不是你想要的功能。