2011-01-22 10 views
1

「読み込み中」というバナーを作成して、アプリケーションが終了したら非表示にします。jQuery - タイムアウトのバナーを作成する

<div id="ajaxBanner"></div> 


function ajaxBanner(action, confirmMsg) { 

    if (action == 'show') { 
     $('#msg').text('Loading...'); 
     $('#ajaxBanner').show(); 
    } else if (action == 'hide') { 
     $('#ajaxBanner').fadeOut(); 
    } else if (confirmMsg == true) { 
     $('#ajaxBanner').show(); 
     ajaxBanner_timeout = setTimeout(ajaxBanner('hide'), 2000); 
    } 
}; 

この関数は、ユーザーに「読み込み中」バナーメッセージを表示して後で非表示にします。問題は、「XXXX XXXに追加」のような確認メッセージにこのスペースを使用することです。

confirmMsgがtrueの場合、Actionショーを実行した後のAJAX呼び出しで問題が発生します。

ajaxBanner_timeoutが完了したら、アクションは== showまたはaction == hideとすることはできますか?

+0

に調査に有用であるかもしれません。 – Malk

+0

最初のロードはどうですか、デフォルトでロードすると、それはちょうどvar ajaxBanner_timout ..ではありませんか? – AnApprentice

+0

私は\tを試しました。(ajaxBanner_timeout == 0){...でも動作しませんでした。どこでajaxBanner_timeoutを定義する必要がありますか? – AnApprentice

答えて

2

1つの問題は、setTimeout()は、文字列または無名関数を使用する関数呼び出しを受け取りません。setTimeout("ajaxBanner('hide')", 2000);です。今すぐ機能はすぐにno pauseと呼ばれます。もう1つの方法は

setTimeout(function(){ 
    //do something; 
},2000); 

です。これが良い方法です。

2

問題は、関数リファレンスを渡す代わりに、あなたのsetTimeoutでajaxBanner( 'hide')を呼び出すことです。匿名関数であなたのajaxBanner(「隠す」)をラッピング問題を解決します:あなたはあなたのJavaScriptコンソールで行うことができます

setTimeout(function() { ajaxBanner('hide'); }, 2000); 

説明/テスト:

違いを確認する1つの方法は貼り付けることですこれはあなたのFirebugコンソールで、それを実行します。

グッド:

// alert fires in 5 seconds 
setTimeout(function() { alert('hide'); }, 5000); 

悪い:

// alert fires right away, despite the 5 second delay 
setTimeout(alert('hide'), 5000); 

UPDATE:それは問題では上記のコード例では不要だと私は変数にはsetTimeoutイベントを割り当てていないです注意。

+0

ありがとうございました。しかし、問題は将来の通話をブロックすることです。与えられた..関数ajaxBanner(action、confirmMsg){ \t if(ajaxBanner_timeout == 0){ ....バナーは決してクリアされません。将来のajaxBannerコールが現在のバナーを置き換えないようにしたいからです。思考? – AnApprentice

+0

私はいつも、関数を呼び出す代わりに、実際のフェードアウトを行うタイムアウトを設定することができます。 – AnApprentice

+1

@AnApprentice - ajaxBanner_timeoutはカウンタではなく、単にタイムアウトイベントへの参照です。それは決してうまくいかないでしょう。あなたはそれを必要としません。また、私の答えをもう一度チェックしてください。変数に代入することなくsetTimeoutを呼び出すだけです。 – jmort253

0
var ajaxBanner_callback = function(){}; 
function ajaxBanner(action, confirmMsg) { 

    if (action == 'show') { 
     var ajaxBanner_callback = function() { 
     $('#msg').text('Loading...'); 
     $('#ajaxBanner').show(); 
     } 
    if (!ajaxBanner_timeout) ajaxBanner_callback(); 
    } 
    else if (action == 'hide') { 
     var ajaxBanner_callback = function() { 
     $('#ajaxBanner').fadeOut(); 
     } 
    if (!ajaxBanner_timeout) ajaxBanner_callback(); 
    } 
    else if (confirmMsg == true) { 
     $('#ajaxBanner').show(); 
     ajaxBanner_timeout = setTimeout(function() { 
     ajaxBanner_callback(); 
     clearTimeout(ajaxBanner_timeout); 
     ajaxBanner_callback = function(){}; 
     }, 2000); 
    } 
}; 

必要に応じてconfirmMsgと同じことができます。

ajaxBanner_timeout == 0は、それが完了している場合には$.queue()

+0

おっと、これは冗長なあなたの質問をちょうど完全に理解しました。 – Fred

+0

ありがとう、フレッド? – AnApprentice

+0

タイムアウトが実行されている間にコードの実行を停止したい場合は、他の応答のいずれかを使用しますが、タイムアウトの実行中にすべてのコードが実行されないようにしてから、これは、複数のアクションとはるかにクールなものをキューに入れることができることを意味します。 – Fred

関連する問題