2009-06-30 12 views
94

私はこれについて先日読んだと確信していますが、どこでも見つけることができません。
私は​​イベントを持っています。その後、要素を削除しますが、jQueryはフェードアウトを終了する前に要素を削除しています。
要素がフェードアウトするまでjQueryを待機させるにはどうすればいいですか?次にを削除しますか?jQueryをエフェクトが終了するまで待つ方法を教えてください。

$(selector).fadeOut('slow', function() { 
    // will be called when the element finishes fading out 
    // if selector matches multiple elements it will be called once for each 
}); 

Documentation here

答えて

146

あなたはコールバック関数を指定することができます。

+0

ビンゴ。私はそれがそうだと思ったが、私がする必要があったのは、取り外し部分だけでなく、私の全機能をそこに置くことだった。 P.S.もし誰かが興味を持っていると読んだ本は、JQueryの学習 - より良い対話とデザインです。もう一度おねがいします – uriDium

+0

誰かが古いjQueryを持っている場合、この「アニメーション完了コールバック」バグは厄介なものでした:http://bugs.jquery.com/ticket/5684 – JustAMartin

+1

ここであなたのupvote番号を返します100 – kaiser

6

切り替えたいものがある場合は、フェードアウトして別の場所をフェードアウトさせると、divに{position:absolute}属性を付けることができるため、両方のアニメーションが互いの上で再生され、 1つのアニメーションが終了してから次のアニメーションを開始するまで待つ必要はありません。

157

jQuery 1.6バージョンでは、.promise()メソッドを使用できます。

$(selector).fadeOut('slow'); 
$(selector).promise().done(function(){ 
    // will be called when all the animations on the queue finish 
}); 
+2

これはほとんどのjQueryアニメーション'promise()'や 'when()'や 'done()'を使うと、サードパーティのメソッドや、自分のものからの非常にクールな動作を利用することができます。 +1の意味は '.promise()'です! – stuartc

+2

すばらしい解決策! –

+4

これまで聞いたことがない、ちょうど私のお尻を保存しました。 – prismspecs

9

あなたにもpromiseが終了するまで待つように$.when()を使用することができます。あなたにも失敗する可能性があり、要求をやっている

var myEvent = function() { 
    $(selector).fadeOut('fast'); 
}; 
$.when(myEvent()).done(function() { 
    console.log('Task finished.'); 
}); 

場合、あなたはさらに一歩を行くことができます:

$.when(myEvent()) 
    .done(function(d) { 
     console.log(d, 'Task done.'); 
    }) 
    .fail(function(err) { 
     console.log(err, 'Task failed.'); 
    }) 
    // Runs always 
    .then(function(data, textStatus, jqXHR) { 
     console.log(jqXHR.status, textStatus, 'Status 200/"OK"?'); 
    }); 
+1

この答えのこの部分は、 'my。()'が約束を返さず、 '$ .when()'を返さないため動作しません。あなたがそれを渡すことを期待しているときに、それがその仕事をするための1つ以上の約束をします。 – jfriend00