2014-06-17 23 views
1

我正在嘗試編寫一些jQuery,它定義了一個名爲progressTracker的變量,它是一個名爲indicator的div id的內容。指標在任何時候,可以改變,這個div的內容將是1或2.如果數字是1,那麼我試圖添加一個「工作」類(它有一個load.gif的背景圖像),如果#indicator的值更改爲兩個,我需要添加一個基本顯示覆選標記的類(至今尚未編碼)。這工作,但它崩潰了我的瀏覽器哈哈。試圖描述我的問題時,請原諒我的任何無知。使用jQuery循環來確定變量的值是否在任何給定時間發生了變化

var progressTracker = $("#indicator").text(); 
var doOnlyOnce = $(0); 

while (progressTracker==1) { 

    if (doOnlyOnce==0){     
     $('.statusIndicator').fadeIn('fast').addClass('working'); 
     var doOnlyOnce = $(1); 
    } 

} 
+0

它的工作原理?我很驚訝,因爲你只能得到'div'的'text()'一次。所以它不會再檢查它。你爲什麼要定義'doOnlyOnce'兩次? – putvande

+0

因爲我測試了腳本中的警報,並且一直保持警戒狀態,所以我認爲這就是使用fadeIn行的方式,一遍又一遍地運行它,所以這是我的嘗試,只做腳本一次執行該代碼而不是一遍又一遍。我其實應該刪除那一點,我認爲這可能導致瀏覽器崩潰。 –

+0

哦,我看到你在說什麼,是的,我只定義了一次progressChecker ..嗯,偉大的一點,所以我需要定義循環內,讓它不斷地檢查一遍又一遍? –

回答

3

您可以嘗試使用遞歸setTimeout輪詢ü pdates:

(function progressTrackerPoll() { 
    var progressTracker = $("#indicator").text(); 
    if(progressTracker === '1') 
     $('.statusIndicator').fadeIn('fast').addClass('working'); 
    else 
     $('.statusIndicator').removeClass('working').addClass('check_mark'); 
    setTimeout(progressTrackerPoll,200); 
})(); 

它將每200毫秒輪詢一次更新。它也包含在Immediately Invoked Function Expression中,所以它不應該干擾你的任何其他代碼。它比setInterval好,因爲如果出現錯誤,它不會無休止地繼續,並且整體上對瀏覽器資源的密集程度會降低。

請確保避免使用while循環進行輪詢,因爲它們可能會導致阻塞,如果條件從未計算爲false,則可能會完全鎖定瀏覽器。

+0

這很好!我不知道如果兩個人發佈了可以工作的答案,該怎麼辦..我對你們在這個網站上所擁有的知識感到謙卑。非常感謝你的幫助! :) –

0

你這樣做太複雜了,並不是說它實際上不適合JS。

請考慮這一點。

// define new custom event 
    $(document).on('isWorking.my', function(e, flag) { 

    if (flag) 
      $('.statusIndicator').stop().fadeIn('fast').addClass('working') 
    else 
      $('.statusIndicator').stop().fadeOut('fast').removeClass('working') 
    }) 

    // now in every place you want to update if you are working or not 
    // instead of 
    $('#indicator').text(1) 

    // you are doing this to start working 
    $(document).trigger('isWorking.my', [1]) 
    // or this to stop 
    $(document).trigger('isWorking.my', [0])  

注意jQuery的事件,您可以通過額外參數到事件處理程序,語法如下:

// triggering event and passing params 
    $(obj).trigger('someEvent', [param1, param2, param3...]) 

    // handling event 

    $(obj).on('someEvent', function(e, param1, param2, param3) { 
     .... 
    }) 

您可以改進具有等多個標誌這一想法,但如果你真的有麻煩等着對於異步操作完成,如Ajax請求,你的真正的方法是使用承諾:

// two ajax operations 
    function loadCategories() { 
     return $.getJSON('/category') 
    } 

    function loadProducts() { 
     return $.getJSON('/product') 
    } 

    // something that should happen when both of them finished 
    function renderMyUI(categories, products) 

    // and kick off 
    $.when(loadCategories(), loadProducts()).done(renderMyUI) 

    // or a click event should kick it off 

    $('button.load').on('click', function() { 
     $.when(loadCategories(), loadProducts()).done(renderMyUI) 
    }) 
+0

爲什麼你的國旗是陣列?我相信'[0]'是真的,所以'如果(旗)'總是真的? –

+0

@JamesMontagne更新我的答案 – vittore

+0

非常感謝你!你們回答這些問題的速度讓我質疑爲什麼我要編碼......在這個問題上掛了好幾個小時。我感謝你的幫助,你的解決方案和Alex W一樣工作。謝謝你借給我一些你的大腦.. –

相關問題