我無法從我的內容腳本中獲得響應以顯示在我的popup.html中。當此代碼運行並單擊查找按鈕時,「來自響應的問候!」打印,但變量響應打印爲未定義。最終目標是將當前選項卡的DOM放入我的腳本文件中,以便我可以解析它。我使用單個時間消息來訪問內容腳本來獲取DOM,但它沒有被返回並顯示爲未定義。我正在尋找任何可能的幫助。謝謝。來自Chrome擴展中的內容腳本的未定義響應
popup.html:
<!DOCTYPE html>
<html>
<body>
<head>
<script src="script.js"></script>
</head>
<form >
Find: <input id="find" type="text"> </input>
</form>
<button id="find_button"> Find </button>
</body>
</html>
的manifest.json:
{
"name": "Enhanced Find",
"version": "1.0",
"manifest_version": 2,
"description": "Ctrl+F, but better",
"browser_action": {
"default_icon": "icon.png",
"default_popup": "popup.html"
},
"permissions": [
"tabs",
"*://*/*"
],
"background":{
"scripts": ["script.js"],
"persistent": true
},
"content_scripts":[
{
"matches": ["http://*/*", "https://*/*"],
"js": ["content_script.js"],
"run_at": "document_end"
}
]
}
的script.js:
var bkg = chrome.extension.getBackgroundPage();
function eventHandler(){
var input = document.getElementById("find");
var text = input.value;
chrome.tabs.query({active: true, currentWindow: true}, function(tabs){
var tab = tabs[0];
var url = tab.url;
chrome.tabs.sendMessage(tab.id, {method: "getDocuments"}, function(response){
bkg.console.log("Hello from response!");
bkg.console.log(response);
});
});
}
content_script.js:
var bkg = chrome.extension.getBackgroundPage();
chrome.runtime.onMessage.addListener(function(request, sender, sendResponse){
if(request.method == "getDOM"){
sendResponse({data : bkg.document});
}else{
sendResponse({});
}
});
對於初學者一些備註:1。你要發送的消息'{方法:「getDocuments」}',但聽取'{method:「getDOM」}'。即使信息匹配,你也會發回你背景頁面的文件。 3.您正在運行'script.js'的兩個獨立實例:一個在您的背景頁面,另一個在您的彈出窗口中。 4.您似乎需要直接獲取一些術語(如背景頁面,彈出窗口,內容腳本)。 5.當一個事件頁面(非持久背景頁面)同樣有效時,您使用的是持久背景頁面,但顯着更「資源友好」。 – gkalpak
(這就是說,是的,我會盡快想出一個實際的答案:)) – gkalpak
你試過我的建議解決方案下面?它對你有用嗎? – gkalpak