【发布时间】:2013-11-07 14:15:22
【问题描述】:
我无法从我的内容脚本中获得响应以显示在我的 popup.html 中。当此代码运行并单击查找按钮时,“Hello from response!”打印,但变量响应打印为未定义。最终目标是将当前选项卡的 DOM 放入我的脚本文件中,以便我可以解析它。我正在使用单个时间消息到内容脚本来获取 DOM,但它没有被返回并且显示为未定义。我正在寻找任何可能的帮助。谢谢。
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.您正在发送消息
{method: "getDocuments"},但收听{method: "getDOM"}。 2. 即使消息匹配,您也会将背景页面的文档发回。 3. 您正在运行script.js的两个独立实例:一个在您的背景页面中,一个在您的弹出窗口中。 4. 你似乎需要把一些术语(如背景页面、弹出窗口、内容脚本)弄清楚。 5. 您正在使用持久性背景页面,而事件页面(非持久性背景页面)同样有效,但明显更加“资源友好”。 -
(也就是说,是的,我会尽快给出一个实际的答案:))
-
您尝试过我下面提出的解决方案吗?它对你有用吗?
标签: javascript google-chrome google-chrome-extension message content-script