2011-01-22 57 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 Added to XXX」。

問題是,當confirmMsg爲true時,它會被後續的AJAX調用與動作顯示中止。

我該怎麼說只做動作==顯示或動作==隱藏當ajaxBanner_timeout完成時?

+0

如果ajaxBanner_timeout == 0則是完全是有用的。 – Malk 2011-01-22 18:26:53

+0

第一次加載時,默認情況下加載它只是var ajaxBanner_timout ..不是那麼零? – AnApprentice 2011-01-22 18:35:40

+0

我試過\t if(ajaxBanner_timeout == 0){...但沒有奏效。我需要在哪裏定義ajaxBanner_timeout? – AnApprentice 2011-01-22 18:36:20

回答

2

一個問題是setTimeout()不帶函數調用它需要一個字符串或一個匿名函數試試setTimeout("ajaxBanner('hide')", 2000);。此時該功能立即被稱爲不停頓。另一種方法是

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

注意這是更好的方法。

2

問題是你在你的setTimeout中調用ajaxBanner('hide')而不是傳入函數引用。在一個匿名函數封裝你ajaxBanner(「隱藏」),將解決這個問題:

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

解釋/測試,你可以在你的JavaScript控制檯來完成:

的一種方式,看看不同的是粘貼這在你的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
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執行相同操作。

它可能調查到$.queue()