我正在研究瀏覽器擴展/附加組件。我們在Chrome中工作,所以我試圖讓它在Firefox中工作。我怎樣才能讓Firefox附加內容注入並在其他頁面腳本之前運行腳本?
我已將我的附加組件加載到Firefox Developer Edition 49.0a2(2016-07-25)。
我的擴展涉及content_script設置爲run_at: document_start
,所以它可以在其他頁面腳本運行之前注入腳本標記,因此它可以使對象全局可用於網站。
這似乎在Chrome中工作正常,但在Firefox中,它已被證明是一種競爭條件,其他頁面資源大多數時間加載。
是否有策略以可注入的方式加載內容腳本&在任何其他頁面腳本運行之前加載腳本?
當我添加日誌時,我可以很好地隔離發生的事情。在這個例子中的內容腳本:
// inject in-page script
console.log('STEP 1, this always happens first')
var scriptTag = document.createElement('script')
scriptTag.src = chrome.extension.getURL('scripts/inpage.js')
scriptTag.onload = function() { this.parentNode.removeChild(this) }
var container = document.head || document.documentElement
// append as first child
container.insertBefore(scriptTag, container.children[0])
現在,如果文件scripts/inpage.js
只是運行日誌,像
console.log('STEP 2, this should always run second')
我訪問的網頁上的腳本是這樣的:
console.log('Step 3, the page itself, should run last')
在實踐中,步驟2和步驟3以非確定性順序運行。
非常感謝!
我有一個特殊的分支公共倉庫的腳本的Firefox兼容的版本,如果你敢嘗試一下自己:https://github.com/MetaMask/metamask-plugin/tree/FirefoxCompatibility
這是我預先在當前頁面上添加腳本標記的行。當我使用日誌執行此操作時,我確實看到此代碼在頁面腳本之前運行,但注入的腳本本身並不總是在頁面腳本之前運行。 https://github.com/MetaMask/metamask-plugin/blob/FirefoxCompatibility/app/scripts/contentscript.js#L20 – DanF