2013-04-03 45 views
2

我正在使用jQuery過濾表,並且一切都很好。此代碼工作得很好:等待所有異步函數在jQuery中完成

$("*[id$='EquipmentTypeDropDownList']").change(filterTable); 
$("*[id$='StateDropDownList']").change(filterTable); 

function filterTable() { 
    var $equipmentDropDown = $("*[id$='EquipmentTypeDropDownList']"); 
    var $stateDropDown = $("*[id$='StateDropDownList']"); 

    var equipmentFilter = $equipmentDropDown.val(); 
    var stateFilter = $stateDropDown.val(); 

    $("tr.dataRow").each(function() { 
    var show = true; 

    var equimpent = $(this).find("td.equipment").text(); 
    var state = $(this).find("td.readyState").text(); 

    if (equipmentFilter != "Any" && equipmentFilter != equimpent) show = false; 
    if (stateFilter != "Any" && stateFilter != state) show = false; 

    if (show) { 
     $(this).fadeIn(); 
    } else { 
     $(this).fadeOut(); 
    } 
    }); 

    $("table").promise().done(colorGridRows); 
} 

function colorGridRows() { 
    //for table row 
    $("tr:visible:even").css("background-color", "#DED7D1"); 
    $("tr:visible:odd").css("background-color", "#EEEAE7"); 
} 

colorGridRows功能更改爲可讀性 奇/偶行的背景顏色現在,這將是很好,如果我可以替換淡入/淡出顯示/隱藏電話,但我不能因爲着色如果它只是一個函數參數 - 我只是創建函數來完成並完成它,但是我的表有很多行並且遍歷每個循環,我該如何等待ALL to compelete?

編輯:代碼示例更新顯示我如何嘗試使用promise(),但它不起作用。它啓動,但我沒有得到奇怪/均勻着色

+0

爲什麼不在同一時間的'show'行和addClass中添加一個計數器?將意味着少一個循環來調整風格 – charlietfl

+0

任何你沒有使用CSS風格偶數和奇數行而不是jQuery的原因? – Andbdrew

+0

我做過了(儘管它對於舊版瀏覽器不起作用),但現在因爲過濾數據而無法工作。當它着色時,CSS不會計算隱藏行 – katit

回答

1

對動畫使用承諾對象。

 $("*[id$='StateDropDownList']").change(function() { 
      var filtervar = $(this).val(); 
      $('tr td.readyState').each(function() { 
       if (filtervar == "Any" || $(this).text() == filtervar) { 
        $(this).parent().fadeIn(); 
       } else { 
        $(this).parent().fadeOut(); 
       } 
      }).parent().promise().done(colorGridRows); 

      //colorGridRows(); 
     }); 
+0

嗯。我認爲它工作,但它不能可靠地工作。當我點擊下拉列表中的數據時,它會過濾數據,但不會正確着色行 – katit

+0

已更新我的原始帖子,顯示我如何嘗試使用promise(),但沒有運氣:( – katit

+0

如果點擊緩慢但不是很快?如果你點擊很快就會出現問題,這是一個完全不同的問題。 –