2016-08-04 58 views
1

我需要在加載的頁面上執行任何其他代碼之前運行一些JavaScript代碼。在背景頁面中是否存在與「run_at:start」等效的內容?

,使用內容這樣的腳本工作正常:

{ 
    "matches": ["http://*/*", "https://*/*", "file://*/*"], 
    "js": ["contentScript.js"], 
    "run_at": "document_start" 
} 

但現在我想只在其中用戶選擇通過點擊瀏覽器上的操作按鈕某些網頁上運行的內容腳本。

我試着聆聽chrome.tabs.onUpdated,然後調用executeScript,但其他代碼正在我的內容腳本之前的頁面上運行。

有沒有辦法確保在其他代碼之前運行由背景頁面注入的代碼?

我也可以在我的內容腳本中添加一個條件,但這意味着我需要訪問當前tabId和激活擴展名的所有選項卡列表。

+1

['runAt:「document_start」'](https://developer.chrome.com/extensions/tabs#method-executeScript) – wOxxOm

+0

@wOxxOm很好,沒有看到。適合我。如果你發佈一個,很樂意接受答案。 –

回答

2

根據文檔chrome.tabs.executeScript有幾個有用的參數,包括runAt(默認情況下它是document_idle,這DOMContentLoaded事件之後),所以要儘快注入腳本儘可能使用runAt: 'document_start'

chrome.tabs.executeScript(tabId, { 
    runAt: 'document_start', 
    code: 'console.log(document.documentElement.innerHTML);', 
}); 

謹防DOM樹通常在這個階段空的,特別是如果你從早期執行的事件監聽器,如tabs.onUpdated或webNavigation.onCommitted注入​​。即使HEAD或BODY元素可能仍然不存在,因此您必須使用(document.head || document.documentElement)後備作爲容器來添加任何節點,例如<style><script>

+0

注意:使用'runAt:'document_start''與* manifest.json *''run_at「:」document_start「'相比的實際性能將在很大程度上取決於* when *,*執行'tabs.executeScript )'關係到加載頁面的過程。實際上,使用'runAt:'document_start''確實意味着在運行'tabs.executeScript()'之後腳本的注入不會被有意地延遲。它確實*不*確保腳本在頁面加載之前被注入(即,使用* manifest.json *選項保證'head'和'body'爲'null')。 – Makyen

相關問題