2014-08-27 116 views
1

我有幾個過濾器可以顯示或隱藏表中的錶行,然後檢查是否沒有可見的行,然後向表中添加一條消息表示不存在行。如何在JavaScript中強制執行下一行之前的行?

這是我如何去做,但慘敗失敗,也許我不知道與JS執行線的方式,也許異步總是?

HTML

<input ID="cbFreshFruits" Checked="true" onclick="ToggleFruits(this)" /> 

腳本

function ToggleFruits(elm) { 
    $target = $('#fruitTable tr[data-status="' + elm.id + '"]').filter(function() { 
     var crates = $("#crateTable tr .selected").parent().map(function() { 
      return $(this).data("crateID"); 
     }).get(); 
     return crates.indexOf($(this).data("crateID")) >= 0; 
    }); 

    if (elm.checked) { 
     $target.show("down"); 
    } 
    else { 
     $('#fruitTable tr[data-status="' + elm.id + '"]').hide("up"); 
    } 

    CheckFruitExists(); 
} 


function CheckFruitExists() { 
    $("#NoFilteredFruits").hide(); 
    $("#fruitTable").show(); 

    if ($("#fruitTable tr:visible").length < 1) { 
     $("#NoFilteredFruits").show(); 
     $("#fruitTable").hide(); 
    } 
} 

問題

當開發者工具檢查,JS執行該語句

if ($("#fruitTable tr:visible").length < 1) 

此人之前,

else { 
      $('#fruitTable tr[data-status="' + elm.id + '"]').hide("up"); 
     } 

我的意思是執行它,但它的變化是不言,例如它在執行語句之前不會隱藏任何行。

請注意,我在不同的地方使用CheckFruitExists,所以我想保持分開。

+1

HTML ** END UP **如何呈現給頁面?我從來沒有聽說過一個標籤。 – Jhecht 2014-08-27 09:36:26

+0

你如何確認執行流程? – Vishwanath 2014-08-27 09:37:16

+0

@Vishwanath 使用開發人員工具檢查了它,提到已經存在問題:-) – Mathematics 2014-08-27 09:47:36

回答

0

JavaScript和DOM的操作是單線程的。瀏覽器通過將項目放入隊列並逐個執行它們來工作。在更新DOM時,實際發生的情況是將請求更新到隊列末尾,所以在JavaScript運行完成後會發生。在這種情況下你需要做的是強制你的第二個函數到這個隊列的末尾,所以它可以在DOM操作發生後運行。您可以通過包裝調用該函數在零超時做到這一點:

window.setTimeout(CheckFruitExists, 0); 

這會導致它被添加到執行隊列的末尾,現在應該在DOM更新發生之後運行。

更新:

按我的意見,在jQuery visible selector認爲是在動畫週期元素:

那段隱藏元素的動畫,則元件被認爲可見,直到結束動畫。在動畫中顯示一個元素時,該元素在動畫開始時被視爲可見。

這意味着當您的CheckFruitExists函數運行時,該元素仍然會進行動畫處理,並且會被視爲可見,無論它是隱藏還是顯示。嘗試刪除您的動畫,看看這是否解決了這個問題(您可能仍然需要使用上述的setTimeout修補程序)。如果有,並且您仍然希望使用動畫,則需要在hideshow的動畫完整回調函數中調用CheckFruitExists

+0

嗯,讓我給它一個去,謝謝:) – Mathematics 2014-08-27 09:48:54

+0

不幸的是,這沒有奏效,我添加了一個斷點,它不檢查行之前檢查他們是否隱藏或不:'( – Mathematics 2014-08-27 09:53:28

+0

他們最終會隱藏?IE做代碼來隱藏它們實際上工作嗎? – 2014-08-27 09:56:38