1

我是鉻擴展的新手,我在開始時遇到了一些問題。郵件在Chrome擴展中傳遞不起作用

首先,我的總體目標是能夠點擊彈出式窗口中的按鈕,並讓DOM中的內容發生變化。如果我理解正確,那麼執行此操作的方法是加載內容腳本並向該內容腳本發送消息。這是我從看Chrome的開發者頁面有,但我沒有看到任何在控制檯日誌:

的manifest.json

{ 
    "manifest_version": 2, 

    "name": "Test", 
    "version": "1.0", 

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

    "content_scripts": [ 
     { 
      "matches": ["http://*/*"], 
      "js": ["content.js"] 
     } 
    ], 

    "browser_action": { 
     "default_icon": "icon.png", 
     "default_popup": "popup.html" 
    } 
} 

popup.html

<html> 
    <body> 
    <script src="popup.js"></script> 
    </body> 
</html> 

彈出.js文件

document.addEventListener('DOMContentLoaded', function() { 
    chrome.tabs.getSelected(null, function(tab) { 
     chrome.tabs.sendMessage(tab.id, {greeting: "hello"}, function(response) { 
      console.log(response.farewell); 
     }); 
    }); 
}); 

content.js

chrome.runtime.onMessage.addListener(
    function(request, sender, sendResponse) { 
     console.log(sender.tab ? 
        "from a content script:" + sender.tab.url : 
        "from the extension"); 
     if (request.greeting == "hello") 
      sendResponse({farewell: "goodbye"}); 
    }); 

很多此代碼直接來自文檔,所以我不知道我做錯了什麼。

+0

我沒看到你的代碼有什麼問題。你的Chrome版本是什麼?根據您的總體目標,我認爲您應該聽取'chrome.browserAction.onClicked'(不彈出)並以編程方式注入內容腳本(https://developer.chrome.com/extensions/content_scripts.html#pi)在事件處理程序中。 –

+0

@方覺我發送給內容腳本的消息取決於彈出窗口中的某些用戶輸入,所以我需要它。我的Chrome版本是26.0.1410.63版。 – gsingh2011

回答

2

我剛剛將您的代碼複製到我的機器上,並按原樣運行,並按預期工作。不過,我想你可能會對感到困惑,其中console.log的輸出結果會顯示出來。

打開任何網頁並打開該頁面的控制檯。點擊你的瀏覽器動作,彈出窗口出現,果然出現from a content script:chrome-extension://fndmlopghajebfadeabnfnfmhalelokm/popup.html行。

雖然沒有看到您的goodbye行顯示,但因爲這是從popup.js註銷的,而不是標籤的內容腳本。讓我們打開彈出窗口的檢查器,然後在那裏查找goodbye消息。右鍵單擊瀏覽器操作圖標並選擇「Inspect popup」菜單項。您的(空)彈出窗口顯示,並出現一個新的檢查器窗口;選擇控制檯選項卡,您將在那裏看到goodbye消息。請參閱Chrome Extension Debugging tutorial

PS。chrome.tabs.getSelected已棄用;代替you should use chrome.tabs.query。我同意方覺 - 你應該考慮使用程序注入來改變你的DOM。

+0

謝謝,這有助於。是否可以將數據傳遞給您以編程方式注入的腳本?這就是我沒有這麼做的原因,我不認爲有可能將任何數據傳遞給腳本。 – gsingh2011

+0

@ gsingh2011:per [PI文檔](https://developer.chrome.com/extensions/content_scripts.html#pi),你可以建立一個任意字符串發送到'chrome.tabs.executeScript'。或者,您可以通過'chrome.tabs.executeScript(null,{file:「content_script.js」});''在需要時插入您的內容腳本,而不是在每個頁面上。這將允許您使用您計劃的相同體系結構,而不必爲用戶打開的每個頁面添加不必要的腳本。 –

-1

popup.js腳本將在加載popup.html(DOMContentLoaded)時啓動該文件。但肯定的是,內容將被注入腳本還沒有在任何網頁,因爲你沒有時間沒有時間打開它,並且「匹配」:[「http:// */*」],沒關係。通過後臺腳本更改後臺內容腳本,我認爲它會起作用。

+0

我認爲內容腳本是在頁面加載時注入的,這是在我打開popup.html之前... – gsingh2011

相關問題