2010-01-11 76 views
0

我正在處理一個非常複雜的.aspx頁面,這是一個完全控制(Telerik,Ajax等),當頁面展開,摺疊,顯示,隱藏等被加載。由於此渲染髮生在客戶端,並可能根據用戶機器規格花費不同時間長度,有沒有辦法檢測何時發生了所有(或某種)渲染(jQuery?),以便我可以針對特定元素,知道他們完全呈現?當所有的HTML頁面呈現已經發生時檢測

+0

由於您是添加這些onload動作的人 - 您爲什麼不在動作結束時添加觸發器?或者可能會添加一些「輪詢」在onload期間更改的項目? – Dror 2010-01-11 15:23:43

+0

你需要'document.ready()'後面的東西嗎? – naivists 2010-01-11 15:25:37

+0

「渲染」在這裏可能有點模棱兩可。你想知道什麼時候所有的頁面元素都已經完成*動畫*(因爲沒有更好的術語)?也就是說,你是否想知道應該擴展的東西何時擴展,應該隱藏的東西是隱藏的等等? – 2010-01-11 15:28:28

回答

2

JavaScript是單線程的。傳遞給setTimeout的時間是最小值,但不是最大值,所以如果你傳遞類似10(ms)的東西,你基本上是說「在所有當前運行的代碼完成後執行此代碼。」

所以,如果所有的控件使用$(document).ready()做自己的事情,你需要的是:傳遞給$(document).ready的所有功能都運行後

$(document).ready(function() { 
    setTimeout(function() { 
     doStuff(); 
    },10); 
}); 

doStuff將被調用。但是,這並非萬無一失。如果控件有自己的方式來檢測文檔是否已加載,或者自己做了setTimeout(),那麼您遇到了麻煩。問題是JavaScript不保證setTimeout的執行順序。有時您的代碼可能會最後運行,有時可能會在用於動畫的setTimeout之前運行。

最後一個想法:如果所有動畫都是使用jQuery完成的,那麼效果將在單個隊列中運行。在doStuff中,您可以添加某種類型的動畫with a callback,並且可以合理確定該回調會最後運行。

0

「然後我就可以作用於特定的元素,知道他們在完全呈現?」

您可以使用load方法(上面鏈接)來附加到任何元素。所以,如果你曾與「是以lastElement」的ID的DIV,你可以寫

$('div#lastElement).load(runThisFunction); 
1

你應該把你的代碼jQuery的$(文件)。就緒()函數中。這將確保在代碼運行之前加載所有元素。

http://docs.jquery.com/Tutorials:Introducing_$(document).ready()

+0

.ready在DOM準備就緒時執行,如果渲染完成,則不執行!如果你想等待頁面完成渲染,那麼你需要.load。 – Mike 2010-01-11 16:40:59

2

無論何時我需要等待多個事情做好準備才能繼續,我會創建一個具有true/false值的數組。頁面的每個必需部分都有一個事件,當它被調用時,將數組中的特定條目更新爲true。此外,它調用一個通用函數,如果數組中的所有值都爲真,則返回true,否則返回false。

如果該函數最終返回true,我將繼續執行。如果您必須等待AJAX​​調用結束,但不想使用async = true,那麼它特別有用。如果你想立刻開始加載多個事物而不是一個接一個地開始,這也很有用,因爲它們都將就緒狀態報告給同一個數組。

但它使用全局變量,所以你可能需要做一些優化。如果你對全局變量有怨氣,你可能不想這樣做。

相關問題