私はイベントハンドラを持っていますが、イベントキュー内の他のすべてのイベントが実行されるまで待ちます。他のすべてのイベントが処理された後にコードを実行する方法
たとえば、ページにいくつかのタブがあります。ユーザーがクリックするとタブを「アクティブなタブ」に設定するタブを処理する一般的なコードがあります。タブをクリックする以外の他のアクションに応じて呼び出されてしまうかもしれません)
// handler-1
$('div#myTabs a.tab').click(function() {
do_something();
});
function do_something() {
var type = $('div#myTabs a.activeTab').data('type');
do_something_else(type);
}
do_something(しかし、関係なく、どのようにそれをする:タブの特定のセットのために
$('a.tab').click(function() {
$(this).parent('div').find('a.tab').removeClass('activeTab');
$(this).addClass('activeTab');
});
、私がハンドラを持っているかもしれませんアクティブになっているタブが継続できるかどうかを知りたがっています。
私の問題は、 '// handler-1'のコードで呼び出された場合、 'activeTab'クラスがまだリセットされていない可能性があるため、 'type'の値は引き続き取得されますこのタグをクリックする前に選択されたタグから。
私はこのようにそれを解決:
// handler-1
$('div#myTabs a.tab').click(function() {
set_timeout(function() {
do_something();
}, 100);
});
をこれは私を満たすためにその場しのぎのあまりのように見えます。タイマーイベントハンドラは、他のハンドラがすべてターンした後にのみ呼び出されることをどのように知ることができますか?確かに「100」を「1000」に変更したり、「10000」に変更したりすることもできますが、パフォーマンスをより確実にすることもできます(ブラウザでは10秒でも不十分です十分に不自由な)。
私が見てきたいくつかの可能な解決策:
が、これらのいずれもが私を満たすのに十分な一般的なものです。私は最初にを実行するハンドラを取得しようとしていません。むしろ、私はこのようなものが欲しい:
function do_something() {
$.when_all_other_events_have_been_handled(function() {
do_something();
});
});
このようなものはありますか?
私は$ .fn.when(arg).done()を見ましたが、何時ですか?この場合の "arg"は、既に実行キューにあるものを実行する遅延オブジェクトでなければなりません。キャッチ22!
Sproutcoreには、「エンジン」内の他のすべてのイベントが処理されたときにのみ返される「engine.run()」(正確な名前は記憶されません)というものがありますが、 jQueryで(http://api.jquery.com/category/events/)。誰かがそのようなことを知っているなら、私に知らせてください!
ありがとうございます! :)
ねえ!あなたは私自身の答えに私を打つ! –
私はこれを正のタイムアウトで使用していましたが、それが競合状態であると考えて、それが有効であることを嬉しく思っています:) – Jake
延期機能を使用するとエラーに直面しました:Ubuntu標準のためにFireFox 20.0で無駄なsetTimeout呼び出し1.0。@ lsidenの答えが私のために働いた。 –