0

問題: 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 を 1 回クリックし、div.b をクリックします => alert() がポップアップします。
div.a をもう一度クリックして div.b をクリックすると、=> alert() が 2 回連続してポップアップします。
div.a をもう一度クリックして div.b をクリックすると、alert() が 3 回連続してポップアップします。
..等々

問題の原因が何であるか、または単にJSでのコールバック関数の誤解/誤用であるかどうかはわかりません。洞察やアドバイスをいただければ幸いです。ありがとう

4

4 に答える 4

1

リファクタリングなしでコードを修正する最も簡単な方法は、バインドを解除して再バインドすることです。

var $=jQuery;
$(function(){
   $("div.a").click(function(){cbf(trgmsg);});
});
function trgmsg(){
   alert($.now());
}
function cbf(cb){
   $("div.b").off('click').click(function(){cb()});
}
于 2013-09-10T17:42:21.193 に答える
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()});
   }
}

これを何に使用するのかはよくわかりませんが、それはあなたの望む機能ではないかもしれません.

于 2013-09-10T17:36:38.540 に答える
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()バインド後、一度だけ実行されるように使用することもできます。または、実際の目標が何であるかを詳しく説明し、それが別の方法で解決できるかどうかを確認する必要があります.

于 2013-09-10T17:31:05.820 に答える
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);
}
于 2013-09-10T17:31:38.697 に答える