2012-06-22 45 views
2

我只需要一個回調和多個回調。用一個簡單的「類」MultiCallback來計算它似乎要解決的調用。 但jQuery的fadeIn函數只調用一次mCallback。jQuery多個回調到一個回調計數調用

它必須調用mCallback 3次。這通過在頂部範圍內直接使用回調函數來實現。

測試我的MultiCallback類也在我自己的功能沒有任何問題。我知道 還有其他方式,如Hide multiple elements with jQuery and get one callback ... 只是想知道我的邏輯有什麼問題。

<div id="1" style="display: none; background-color: green;"></div> 
<div id="2" style="display: none; background-color: red;"></div> 
<div id="3" style="display: none; background-color: blue;"></div> 

<script> 

    var allElements = "#1, #2, #3"; 
    var multiCallback = new MultiCallback($(allElements).length, function() 
      { 
       console.log("NEVER ENTER CALLBACK"); 
      }); 
    $(allElements).fadeIn(400, multiCallback.mCallback()); 

    function MultiCallback(limit, fn) 
    { 
     var finishedCalls = 0; 

     function mCallback() 
     { 
      // Just enter one time ! 
      if (++finishedCalls == limit) 
      { 
       fn(); 
      } 
     } 

     return { 
      mCallback : mCallback 
     } 
    } 

</script> 
+0

你的目標是在時間相繼淡出的div嗎? – Cranio

+0

請注意,您正在調用三次回調,但它們會在同一時間執行。這就是我問的原因。 – Cranio

+0

@Cranio是的,我想同時淡化所有3個div。有沒有像在c#中的「鎖定」? –

回答

2

變化

// executes function, returns undefined, passing undefined 
$(allElements).fadeIn(400, multiCallback.mCallback()); 

// pass a reference to the function 
$(allElements).fadeIn(400, multiCallback.mCallback); 
+1

謝謝,這很明顯。有一個傻瓜。 –

1
  1. 更換multiCallback.mCallback()來multiCallback.mCallback

  2. 場所內$(function(){ ... });你的代碼,因爲DOM元素在那個時候可能不可用。

fixed code on jsFiddle