2012-12-30 141 views
5

我正在試驗chrome.extension API。Chrome onMessage監聽器未被調用

的manifest.json

{ 
    "name": "First", 
    "version": "1.0", 
    "manifest_version": 2, 
    "description": "First extension", 
    "background": { 
     "scripts": ["test.js"] 
    },  
    "page_action": { 
     "default_icon": "icon.png", 
     "default_popup": "popup.html" 
    },  
    "content_scripts": [ { 
     "js": [ "jquery.min.js", "display.js" ], 
     "matches": [ "http://*/*", "https://*/*" ]  
    } ], 

    "permissions" : [ 
     "tabs", 
    "http://*/*", "https://*/" 
     ] 
} 

display.js

alert("inside display.js"); 

chrome.extension.onMessage.addListener(
     function(request, sender, sendResponse){ 
      alert("inside msg"); 
      var time = request.sel_text; 
      alert(time); 

     }); 

test.js

function check(tab_id, data, tab){ 
    if(tab.url.indexOf("google") > -1){ 
     chrome.pageAction.show(tab_id); 
     chrome.tabs.executeScript(null, {"file" : "display.js"}) ; 
    } 
}; 
chrome.tabs.onUpdated.addListener(check); 

popup1.js

function myfunc(){ 

    var x = $('#options option:selected').text(); 
    alert(x); 
    chrome.extension.sendMessage({sel_text: x}); 

} 

$(document).ready(function(){ 
    $('#options').change(myfunc); 

}); 

現在,當我的頁面加載我得到three(3)彈出窗口說inside display.jschrome.extension.onMessage.addListener永遠不會被調用。

那麼,我做錯了什麼。我們可以從內容腳本訪問chrome.extension.* API嗎?

回答

6

chrome.extension.sendMessage只觸發onMessage聽衆在擴展的範圍內,不包括內容腳本

可以使用chrome.tabs.sendMessage方法通知內容的腳本,如下所示:

function myfunc() { 
    var x = $('#options option:selected').text(); 
    var message = {sel_text: x}; 
    chrome.tabs.query({active: true, currentWindow: true}, function(tabs) { 
     var tabId = tabs[0].id; 
     chrome.tabs.sendMessage(tabId, message); 
    }); 
} 
+0

感謝這個工作。你能否提供給我的文檔說明'chrome.extension.sendMessage'不會觸發內容腳本,因爲我創建的Chrome消息API非常容易混淆 – RanRag

+0

「請注意,擴展程序無法使用此方法將消息發送到內容腳本。要將消息發送到內容腳本,請使用chrome.tabs.sendMessage()。「 - ['chrome.extension.sendMessage']的文檔(http://developer.chrome.com/extensions/extension.html#method-sendMessage) (和經驗) –

+0

(先前的評論被取消)它確實,我錯誤地閱讀了文檔並找出了我的問題。 –

0

chrome.extension.sendMessage({sel_text: x});這是popup1.js未在您的清單文件中使用或引用。你在哪裏使用popup1.js你的擴展?

chrome.extension.onMessage.addListener在從擴展進程或內容腳本發送消息時觸發,您的代碼中沒有發送任何消息!

此外,您爲什麼要從background page重新注入腳本chrome.tabs.executeScript(null, {"file" : "display.js"}) ;,而它已經註冊爲manifest file

+0

'popup1.js'在'popup.html' [文件]使用(http://sprunge.us/ITDJ) 。我在popup1.js中使用'sendMessage',所以我相信我正在發送消息。 – RanRag

+0

@Noob:當只有'瀏覽器動作圖標'被點擊或'popup.html'被激活時纔會發送消息,你試過了嗎? – Sudarshan

+0

如果我把'display.js'代碼放在'test.js'裏面,它可以正常工作。 – RanRag