2012-03-09 4 views
3
<button onclick="$.MyObject.add('wrapper');">Add</button> 

どこかに私がしたコードで:アニメーションが終了する前にjQueryのcomplete関数が呼び出されているのはなぜですか?

$.MyObject= new MyUberObject(); 

その後、私のに私は戻って私のコールを指定して、アニメーションを起動し、それに私のコールバックを渡し、機能を追加します。

function MyUberObject(data) { 
    ... 
    this.add = function(name, index) { 
    var callback = function(n,i) { 
       $.MyObject.addDiv(n, i); 
       alert("wtf"); 
      }(name, index); 

    $("#outerWrapper").animate(
     { 
      "width": "+=200px",    
     }, 
     { 
      duration : "fast", 
      easing: "linear", 
      complete: callback 
     }    
    ); 
    ... 
} 

アラートは、すぐにボタンが押されているように私は警告をクリアしたら、その後、アニメーションは、私がコールバックを指定するさまざまな方法を試してみた...行くとすぐに出てくるだけでなく、しかし、遅延を使用して他の場所で呼び出すようにしてください...まだ行かないでください。

+1

私も、JSの私のデバッグに警告(「WTF」)を使用します!打ち上げ前に取り出すことを忘れないでください...恥ずかしいかもしれません。 :) – evasilchenko

+0

hah。あなたは閉鎖を使う必要があるのですが、私の反応を見て、あなたは近くにいます。 - 私はあなたが閉鎖を本当に必要としないと思うが、私はそれがループ内で実行されていると思った。 – thescientist

答えて

5
var callback = function(n,i) { 
      $.MyObject.addDiv(n, i); 
      alert("wtf"); 
     }(name, index); 

ここでコールバックしているので、呼び出されています。

はこれをやってみて、私は名前とインデックスが原因閉鎖に存在するべきだと思います。その後、あなたはouterwrapperに名前とインデックスを追加することができない場合

function MyUberObject(data) { 
    ... 
    this.add = function(name, index) { 

    var callback = function() { 
       $.MyObject.addDiv(name, index); 
       alert("wtf"); 
      }; 

    $("#outerWrapper").animate(
     { 
      "width": "+=200px",    
     }, 
     { 
      duration : "fast", 
      easing: "linear", 
      complete: callback 
     }    
    ); 
    ... 
} 

:多分

function MyUberObject(data) { 
    ... 
    this.add = function(name, index) { 

    var callback = function() { 
       $.MyObject.addDiv($(this).data("props").name, $(this).data("props").index); 
       alert("wtf"); 
      }; 

    $("#outerWrapper").data("props", {name : name, index : index}; 
    $("#outerWrapper").animate(
     { 
      "width": "+=200px",    
     }, 
     { 
      duration : "fast", 
      easing: "linear", 
      complete: callback 
     }    
    ); 
    ... 
} 

またはさらに簡単な...

function MyUberObject(data) { 
    ... 
    this.add = function(name, index) { 

    var callback = function(n, i) { 
       $.MyObject.addDiv(n, i); 
       alert("wtf"); 
      }; 

    $("#outerWrapper").animate(
     { 
      "width": "+=200px",    
     }, 
     { 
      duration : "fast", 
      easing: "linear", 
      complete: function(){callback(name, index);} 
     }    
    ); 
    ... 
} 
+0

最初の解決策が動作します。奇妙な、ある時点で私はそれに前に(名前、インデックス)を渡すことなくそれを試して、それはエラーをスローします。しかし、多くのおかげで、昨夜以来これを打つことでした! – codenamezero

2

あなたが関数を実行し、自己を使用しています、それが警告を見る理由です。 return文で匿名の自己実行関数を使用してみてください。

var callback = function(n,i) { 
    return function(){ 
    $.MyObject.addDiv(n, i); 
    } 
}(name, index); 

Closures - MDN

2
var tmp = function() { 
    console.log("automatically executed!"); 
}(); 

var tmp = function() { 
    console.log("Executed when invoked!"); 
} 

だからあなたのコールバックを呼び出すことで待ちます。

関連する問題