2011-07-29 21 views
1

我有一個頁面通過Ajax自動刷新內容。我想這是微妙的,所以我不想在自動頁面刷新期間顯示我的加載gif。所以,我沒有這樣的事情與我的getPosts功能(不必要的代碼切出簡潔)爲什麼參數不能一直髮送到setInterval()中的函數?

function getPosts(image) 
      { 
       //loading icon while getPosts 
       if (image) 
       { 
        $("#postcontainer").bind("ajaxStart", function(){ 
         $(this).html("<center><img src='ajax-loader.gif' /></center>"); 
       }); 
       } //... ajax call, etc. don't worry about syntax errors, they aren't in real code 

我知道中央標籤已被棄用,只是一個無恥的快捷方式。 然後我將設置像setInterval(function() { getPosts(false); }, 10000); 間隔所以我自動調用不會觸發圖像顯示 我所有的手動刷新,然後將這樣稱呼它getPosts(true);

您可以(可能)看到my personal site行動的bug

問題是,setInterval函數似乎使用最新函數調用的圖像布爾。因此,在自動調用期間,它不會首先顯示圖像,但在單擊手動刷新後,它會在每次調用期間開始顯示圖像。

我該如何解決這個問題?

感謝任何查看/發佈此主題的人!我希望這個問題能成爲其他人的一個很好的參考。

回答

0

的問題是,一旦你已經綁定你的「ajaxStart」處理的容器,將執行每個Ajax調用該容器。也就是說,你第一次用getPosts(true)調用它時,它會創建綁定。下一次你用getPosts(false)調用它時,它並不會沿着那個if的路徑走下去,但綁定仍然存在,所以當你進行ajax調用時,處理程序仍然執行 - 而且處理程序沒有任何條件邏輯。 (實際上,我相信你最終會在「ajaxStart」事件上得到多個綁定,每次你調用getPosts(true)時都會創建一個綁定,但是它們可能不是不可知的,因爲它們都會覆蓋同一個html,做同樣的事情。)

爲什麼不做這樣的事情:

function getPosts(image) { 
    if (image) { 
    $("#postcontainer").html("<center><img src='ajax-loader.gif' /></center>"); 
    } 

    // Actual ajax call here 
} 

setInterval(function() { getPosts(false); }, 10000); 
0

因爲在第一次手動刷新之後,您已經附加了一個事件處理程序「ajaxstart」,它在ajax調用開始時顯示圖像。現在這個事件處理程序在那裏,即使你用image = false調用該函數。它會在所有ajax調用中觸發。

你需要做的是一樣的東西:

$("#postcontainer").bind("ajaxStart", function(){ 
         $(this).html("<center><img src='ajax-loader.gif' /></center>") 
      //Remove event handler 
      $(this).unbind("ajaxStart"); 
}); 
相關問題