2013-04-18 24 views
1

我正在學習構建Chrome擴展程序,我正在嘗試使用官方指南here中的說明之一。DOM例外12 for window.postMessage

我試圖做到的是:

  1. background.js顯示了針對性的URL頁面動作。
  2. 頁面操作在單擊時執行腳本。
  3. 執行的腳本在頁面上注入javascript。

到目前爲止,太棒了!我使用以下腳本注入頁面。

var injectJS = function(url, cb) { 
    var h = document.getElementsByTagName('head')[0], 
     s = document.createElement('script'); 
    s.type = 'text/javascript'; 
    s.src = url; 
    if (cb) 
     s.onload = cb; 
    h.appendChild(s); 
}; 
injectJS(chrome.extension.getURL('script/do_something.js')); 

現在,我希望注入的腳本能夠傳回給擴展。
看來我正在尋找的是文檔中描述的內容。

https://developer.chrome.com/extensions/content_scripts.html#host-page-communication

的問題是,當我嘗試做window.postMessage控制檯顯示錯誤「DOM異常12」。


編輯:運行示例代碼的第一個問題已解決。
其他錯誤我得到的,從SMAE代碼爲port.postMessage

Uncaught Error: Attempting to use a disconnected port object

下面的代碼:

var port = chrome.runtime.connect(); 

// Respond to messages from the injected script to collect results 
window.addEventListener('message', function(e) { 
    if (e.source != window) 
     return; 
    if (e.data.type && (e.data.type == 'FROM_PAGE')) { 
     console.log('Content script received: %s', e.data.text); 
     port.postMessage(e.data.text); 
    } 
}, false); 

基本上我想暫時堅持某些數據而重新加載頁面。內容腳本/注入腳本收集數據,然後加載下一頁。後臺腳本應該保存結果,直到所有頁面都被加載完畢。

回答

5

請勿在contentscript.js示例中的port.postMessagewindow.postMessage混淆。

port.postMessage是Chrome擴展特定的API,旨在在擴展中傳遞消息,而window.postMessage是一種用於與幀通信的JavaScript方法。 window.postMessage的第二個參數是必需的,用於驗證目標是否被允許接收消息。

在你的情況下,使用通配符可能是足夠的,因爲你發送從頁面信息給自己:

window.postMessage({ type: "FROM_PAGE", text: "Hello from the webpage!" }, "*"); 
                      ^^^
+0

謝謝你,這正是它!我應該更加關注樣本。 還有一個問題,如果你不介意。繼續使用相同的代碼,'port.postMessage'部分現在不能工作。我的偵聽器腳本運行,並記錄數據以驗證它是否存在,但現在它說端口已關閉。 –

+0

然後其中一個死亡。如果沒有看到您的代碼,則無法確切說明原因。 –

+0

我更新了一些額外的細節,如果有幫助的原始帖子。 –