2013-05-08 27 views
0

我試圖在執行函數之前顯示加載圖標,但我沒有線索如何執行此操作。在執行函數之前顯示加載圖標

我的代碼:

$(".chartType").on("click", function(event){ 
    $("#wrapper").addClass("loading");  
    changeChartType($(this).attr("value"));  
    $("#wrapper").removeClass("loading"); 
}); 

它顯示了一個加載圖標(如果removeClass()註釋掉)圖表實際上已經被加載後。如果有人知道解決方案,請立即告訴我。

我試過使用setTimeOut(),jQuery的時候,然後做,但似乎沒有任何工作。

我使用Google的可視化圖表來顯示各種圖表。我可以通過點擊圖標在圖表之間切換。

之後,上面的函數將被執行。

功能changeChartType():

function changeChartType(typePar){ 
    chartType = typePar; 
    chart = new google.visualization[chartType](chartDiv); 
    drawChart(); 
} 

而且在drawChart它只是調用chart.draw(); 這需要一段時間,因此我想顯示一個加載圖標。

問題不在於刪除加載圖標,而是通過添加類來顯示加載圖標。目前它在繪製圖表後添加該類。也許有一個同步這個。

+0

如果'changeChartType()'是異步的而不修改'changeChartType()',那麼你不能這樣做。請提供'changeChartType'的功能。爲什麼使用'$(this).attr(「value」)而不是'$(this).val()'或'this.value'? – 2013-05-08 14:26:20

+0

如果你改變'img',你可以使用'load()'函數。 – shuaqiu 2013-05-08 14:27:47

+0

新手錯誤我想,更多信息在一分鐘 – MmynameStackflow 2013-05-08 14:28:03

回答

0

你的所有功能都是同步的。這意味着他們在很短的時間內陸續運行。 異步函數需要時間和回調,所以你可以在完成之後做些事情。 例如:

$(".chartType").on("click", function(event){ 
    $("#wrapper").addClass("loading");  
    $("element").on("load",function(){ 
     $("#wrapper").removeClass("loading"); 
    });  
}); 

「removeClass」 功能將 「元件」 後運行時加載。

+0

是的,我知道,但加載圖標還沒有。 – MmynameStackflow 2013-05-08 14:39:23

0

您的包裝在changeChartType函數完成之前刪除行運行。如果不以某種方式包裝到上一個函數中,removeClass函數會在讀取完成後立即觸發,這可能是在前一個函數完成之前。

$(".chartType").on("click", function(event){ 
$("#wrapper").addClass("loading"); 
$.when({ changeChartType($(this).attr("value")) }).done(
    $("#wrapper").removeClass("loading"); 
); }); 

我還沒有測試過這個,但是打錯了,這個想法應該工作。

這裏的時候/完成文檔的鏈接:http://api.jquery.com/jQuery.when/

+0

Downvoted ????爲了什麼?上帝我有時候討厭這個網站。 – 2013-05-08 14:42:31

+0

我試過這個,但沒有低估這個。 – MmynameStackflow 2013-05-08 14:44:49

0

的谷歌圖表可視化API的draw方法是異步的,這又是對整個函數鏈異步。你需要做的就是傾聽由所有這些混亂所引發的事件並採取相應的行動。該事件被定義並描述爲here

爲了達到這個目的,您需要對代碼進行相當多的修改。這裏是這樣做的最簡單的方法:

$(".chartType").on("click", function(event){ 
    $("#wrapper").addClass("loading"); 
    var chart = new google.visualization[$(this).attr("value")](chartDiv); 
    google.visualization.events.addListener(chartDiv, 'ready', function() { $("#wrapper").removeClass("loading") }); 
    chart.draw(); 
}); 

應該工作,但它假定chartDiv是在範圍之內。

+0

Nop,我已經試過這個。 – MmynameStackflow 2013-05-08 14:45:47

+0

@MmynameStackflow:如果它不起作用 - 它會失敗嗎?其實,你可以從你當前的代碼中構建一個小提琴,這樣我們都可以解決它嗎? – 2013-05-08 14:49:04

+0

問題不在於刪除部分,而在於添加部分。 – MmynameStackflow 2013-05-08 14:51:16