2012-06-04 65 views
23

我正在使用多個代碼塊設置document.ready()(jQuery)上的某些行爲。有沒有辦法強制執行一個特定塊在其他任何塊之前被調用?jQuery:強制執行document.ready()調用的執行順序

背景: 我需要在自動化測試環境中檢測JS錯誤,所以我需要在執行任何其他JS代碼之前開始記錄JS錯誤的代碼。

+2

錯誤日誌代碼塊是否真的需要等待DOM準備好? –

+0

@KevinB好點!它甚至可能是值得的,因爲它不會等待... – msanford

+0

@KevinB我對JS不是很熟悉。如果我將代碼放在任何代碼塊之外,是否可以保證在執行任何其他代碼之前運行代碼? –

回答

22

document.ready()回調按其註冊的順序調用。如果您首先註冊您的測試回調,它將首先被調用。

此外,如果您的測試代碼實際上並不需要操作DOM,那麼您可以在解析代碼時運行它,而不是等待DOM準備就緒,然後再調用其他document.ready()回調。或者,也許您可​​以立即運行部分測試代碼,並只推遲使用DOM的部分,直到document.ready()

另一個想法是(僅供測試),你可以與添加一個標誌,document.ready()是過去了,設置爲true時表示,首先調用該函數或者你可以添加新的方法的jQuery略加修改版本上運行document.readyFirst()那會首先調用你的函數。這將涉及對jQuery中的document.ready()處理代碼的輕微更改。

+0

@AnkitSoni - 爲什麼8個月後刪除最佳答案標籤?什麼改變了? – jfriend00

+1

我的錯誤,重新加入。相反,我再次指出這仍然有幫助! –

0

您可以在DOMReady和其他初始化中執行日誌開始代碼。或者你可以創建自己的初始化管理器,它首先調用你的日誌開始代碼,然後是所有其他的初始化回調(前提是那些註冊到你的管理器而不是jQuery,除非你想破解jQuery並從那裏提取它們,建議)。

6

您應該可以使用holdReady來做到這一點。只要它包含在準備好的事件之前,就可以運行自己的代碼,然後觸發其他準備好的事件。

7

正如@ jfriend00提到ready callbacks are called in the order they were registered.

所以,即使此呼籲開始代碼塊,你可以將它設置另一個回調所以它會在最末端的執行。

jQuery(document).ready(function(){ 
    jQuery(document).ready(function(){ 
     // This block will be executed after all ready calls. 
    }); 
}); 
+1

這種方法確實有效,但我可以想象它在某些情況下給出了一些非常奇怪的結果。而且,它的代碼味道遍佈它,對於未來的開發人員維護代碼而言,這非常令人困惑。 – Edwin

+1

@Edwin,但它是一個可行的解決方案。 – Dmitry

+1

非常好的解決方案,甚至可以在jQuery 3中使用。 – ViRuSTriNiTy

0

我試圖做同樣的事情,我是裝了一堆polyfills說有。就緒()函數,但我也有我自己的。就緒()頁S上,我需要先執行,儘管polyfills被加載到標題中。

我發現一個很好的解決方法,就是在.ready()很早的時候(在jQuery加載之後)執行數組中的函數。由於它在源代碼的早期階段就是先執行.ready()。更進一步,我可以向該數組添加函數,因此它們都在任何其他.ready()之前執行。

我已經將它包裝在一個.beforeReady()函數中,並將它放在GitHub上,作爲jQuery-Before-Ready供任何感興趣的人使用。 https://github.com/aim12340/jQuery-Before-Ready