2012-10-17 115 views
4

財產 '的onMessage' 在background.htmlchrome.extension.onMessage.addListener無法讀取的不確定

chrome.tabs.query({active:true, currentWindow:true},function(tabs){ 
    chrome.tabs.sendMessage(tabs[0].id,"target.js"); 
}); 

content.js

chrome.extension.onMessage.addListener(function(msg,sender,sendResponse){ 
    if (msg == "target.js"){ 
    extensionID = sender.id; 
    } 
}); 

但是,這是行不通的;

Uncaught TypeError: Cannot read property 'onMessage' of undefined 

如何糾正錯誤?

+1

你使用Chrome 19或更低? content.js是內容腳本嗎? –

+1

我正在使用chrome 21. content.js是一個內容腳本,它被另一個內容腳本注入到當前選項卡。 – user1753524

回答

10

你說過「content.js是一個內容腳本,它被另一個內容腳本注入到當前標籤。」。

這裏存在你的問題。注入腳本在頁面的上下文中執行(就像它們是由頁面本身創建的一樣),因此他們無法訪問任何Chrome擴展API。

您可以使用自定義事件或postMessage在頁面和內容腳本之間進行通信,該腳本又與後臺頁面進行通信。

舉例來說,看到這個基本的例子:

// Injected script script 
addEventListener('message', function(event) { 
    if (event.data && event.data.extensionMessage) { 
     alert(event.data.extensionMessage); 
    } 
}); 
// Content script which injects the script: 
chrome.extension.onMessage.addListener(function(message) { 
    postMessage({extensionMessage: message}, '*'); 
}); 

我認爲你要使用content.js作爲一個真正的內容腳本雖然,而不是注入腳本。如果您想了解注入的腳本和內容腳本之間的區別,請參閱Chrome extension code vs Content scripts vs Injected scripts

+0

非常感謝你,我會稍後再試。在我的擴展中有兩個腳本。一個是content.js,一個是target.js(這是一個真正的content.js)。並且是否注入content.js取決於target.js.And我需要在content.js中獲得extensionID,所以我想在background.html和content.js之間交換消息。 – user1753524

+0

通過你所說的我用localStorage解決了這個問題的啓發....非常感謝你!! ~~ – user1753524

0

看起來你正在嘗試對當前選項卡執行一些操作。你確定你需要一個消息來做到這一點?我假設background.html是您的擴展的後臺頁面,content.js是您的內容腳本。現在我跳過background.html頁面,並簡單地爲我的背景頁面運行一個JavaScript文件。我的manifest.json頁面看起來像這樣。

"background": { 
    "scripts": [ "js/background.js"] 
    }, 

在該頁面中,我添加消息監聽器,以我的背景頁面,因爲這是我所知道的與background.js文件交互的唯一途徑。然而,就你而言,它是執行此操作的後臺頁面,因此您可以使用chrome.tab方法直接修改當前選項卡。而不是onMessage,你可以嘗試一些executeScript,其中InjectDetails是JavaScript或任何你想要執行的。

chrome.tabs.query({active:true, currentWindow:true},function(tabs){ 
     chrome.tabs.executeScript(tabs[0].id, InjectDetails); 
}); 

查看更多關於HERE

+0

事實上,我只想在content.js.中獲取我的擴展的id,但似乎在content.js.中沒有允許chromeAPI,所以我嘗試了這種方法,但它失敗了..... content.js是一個內容腳本,它被注入到另一個內容腳本的當前標籤我不知道它是否重要.... – user1753524