2015-01-11 205 views
1

我爲gmail創建了一個Chrome擴展,並且在某些頁面對象加載時看到了一些奇怪的不穩定性。由於我試圖修改GMAIL DOM(爲我的擴展定製它),因此需要在我的初始化器運行之前完全加載。我的擴展總是在DOM完全加載之前初始化,所以我需要一種方法讓它輪詢,直到DOM完全形成來完成它的事情。Gmail Chrome瀏覽器擴展和document.readyState

我已經嘗試使用document.readyState來輪詢文檔,所以我知道何時開始修改完全加載的DOM,但它並不總是工作。

一旦頁面開始加載,我在控制檯中輸出document.readyState每100毫秒輪詢一次,並且我注意到大約1/10頁加載document.readyState在DOM完全加載之前變爲「完整」。我可以告訴這個,因爲我爲GMAIL撰寫按鈕做了一個jQuery選擇器,並且在發生這種情況時它變爲空,並且每隔一段時間都按預期發現它(它找到了撰寫按鈕)。

這是爲什麼?有沒有更好的方法讓我的擴展名初始化腳本檢查,以確保DOM在完成DOM mods之前完全加載?

編輯 - 我有腳本檢查document.readyState作爲腳本注入到用戶界面作爲內容腳本。

+0

如果您正在等待撰寫按鈕出現,爲什麼不輪詢該按鈕而不是'document.readyState'? readyState和該按鈕之間沒有保證關係... –

回答

3

Gmail網站是動態的。 readyState/DOMContentLoaded和朋友都毫無用處,因爲大部分UI都是動態構建的,並且不在「初始」DOM中。這正是你所觀察到的。

您需要爲RobW提到的撰寫按鈕進行輪詢,或者觀察它是否添加了MutationObserver events。還值得注意的是mutation-summary library

+0

要等待一個元素存在進行初始化,我建議使用setTimeout來輪詢MutationObservers,因爲它性能更好。 –

+0

@RobW我想這取決於你需要多快反應。如果MO甚至被使用過一次(並且之後斷開連接),那麼頁面是否會變慢? – Xan

+1

斷開的突變觀察者從不減速(突變事件)。但是,特別是在構建動態頁面(如Gmail)時,突變觀察者會非常頻繁地觸發。由於OP的目標是在呈現合成按鈕時最終運行一些邏輯,因此重複輪詢按鈕就足夠了。例如超時250毫秒就足以及時檢測按鈕(瞬間)。 –

-1

您的代碼document.readyState應位於您的內容腳本上。

背景和彈出頁面引用的文檔不是網頁的文檔。

此處瞭解詳情:https://developer.chrome.com/extensions/overview#arch

+0

我的代碼與gmail DOM交互,並且使用document.readyState知道何時激活,它們都位於內容腳本中。我根本不使用背景或彈出頁面來完成這個擴展。 – BryanP

相關問題