2016-11-22 83 views
3

我試圖從網頁與擴展進行通信,反之亦然。API Web擴展,在瀏覽器和內容腳本之間進行通信

要做到這一點,我看着Mozilla的文檔在這裏:https://developer.mozilla.org/fr/Add-ons/WebExtensions/Content_scripts#Communicating_with_the_web_page

而且它有一個簡單的例子,但我不能使它發揮作用。在網頁的腳本,我有這樣的:

// page-script.js 

var messenger = document.getElementById("from-page-script"); 

messenger.addEventListener("click", messageContentScript); 

function messageContentScript() { 
    window.postMessage({ 
    direction: "from-page-script", 
    message: "Message from the page" 
    }, "*"); 

在內容腳本頁面的擴展:

// content-script.js 

window.addEventListener("message", function(event) { 
    if (event.source == window && 
     event.data.direction && 
     event.data.direction == "from-page-script") { 
    alert("Content script received message: \"" + event.data.message + "\""); 
    } 
}); 

我安裝的擴展(作爲一個暫時的,我上傳了我的XPI文件)然後我使用API​​ WebExtensions的「調試」方法,並將一個斷點放入偵聽器,但每當我調用PostMessage時,該擴展都不會接收事件,斷點從不觸發。

這樣可以在網頁和擴展之間進行通信嗎?還是有另一個?

+0

請編輯問題爲題目:包括一個**完整的** [mcve],重複的問題。包括一個* manifest.json *,一些背景*和*內容腳本。尋求調試幫助的問題(「**爲什麼不是這個代碼工作?」)必須包括:►期望的行爲,►特定問題或錯誤*和*►在問題中重現問題所需的最短代碼**本身**。沒有明確問題陳述的問題對其他讀者無益。請參閱:「**如何創建[mcve] **」,[我可以在此處詢問哪些主題?](http://stackoverflow.com/help/on-topic)和[問]。 – Makyen

+0

您的代碼適用於我的環境。有幾件事你可以檢查:嘗試使用解壓擴展而不是xpi,檢查兩個腳本是否加載。嘗試從頁面控制檯運行'messageContentScript()'。 –

+0

非常感謝Anatoly Sazanov,我明白了。當我將Chrome擴展程序改編爲Firefox擴展程序時,我使用了後臺腳本。我沒有看到它,但清單聲明我的內容腳本爲後臺腳本,因此是錯誤。 – Thordax

回答

1

問題在於我的擴展。我將我的內容腳本聲明爲後臺腳本。

所以,不要寫成這樣:

"background": { 
    "scripts": ["myscript.js"], 
    "persistent": true 
    }, 

您必須聲明這樣的腳本:

"content_scripts": [ 
    { 
     "matches": ["<all_urls>"], 
     "js": ["myscript.js"] 
    } 
    ] 
0

我遇到類似問題,並且這個問題對我來說是我打電話的

window.postMessage 

從iframe中的函數。我改成這個後

top.window.postMessage 

它開始工作。

相關問題