我遇到了问题。通过消息传递,我将DOM数据从内容脚本传输到后台页面。我想知道的是如何在选项页面和背景页面之间建立通信渠道。 API chrome.extension.getBackgroundPage()
无效。通过sendRequest
和addlistener
的传统消息也不起作用。如何将此数据从后台页面传输到选项页面?有人可以提供一个经过测试的片段来解释吗?
这就是我一直在尝试的。 在我的contentscript.js
<script>
var selected_Text ="";
window.addEventListener("dblclick",function(event){
selected_Text = String(window.getSelection());
chrome.extension.sendRequest({greeting: "maprender",name:selected_Text}, function(response) {
alert("reached here")
console.log(response.farewell);
});
//i am to then load options.html on DOM like this
var Div = document.createElement("iframe");
Div.setAttribute('src', chrome.extension.getURL('options.html'));
Div.setAttribute("style","width:130px;height:80px;position:absolute;left:10px;");
Div.setAttribute("id","xyz");
document.body.appendChild(Div);
</script>
我在background.html中检索了selected_Text,就像这样
<script>
var Addr_details={
place:null
};
chrome.extension.onRequest.addListener(
function(request, sender, sendResponse) {
if (request.greeting == "maprender")
{
alert("reached here sendin resp"+request.name);
Addr_details.place = request.name;
sendResponse({farewell: "goodbye"});
}
else
sendResponse({}); // snub them.
});
</script>
现在要在选项页面options.html访问此文本的值,我尝试了2种方法 一个是像这样使用chrome.extension.getBackgroundPage():
<script>
function init(){
var bkg = chrome.extension.getBackgroundPage();
alert("the selected text is "+bkg.Addr_details.place);
}
</script>
init是onload of options.html。这不会给我价值。事实上,它只是在chrome.extension.backgroundPage初始化时终止。
我尝试的另一种方法是从具有不同问候语的contentscript.js创建一个类似的请求(比如在contentscript.js中已经存在的请求),并在options.html中添加一个监听器。这似乎无论如何都在接收方(选项页面),因为我在请求后收到了脚本的回调。我肯定做错了什么,不是吗?请帮忙。
答案 0 :(得分:4)
第二种方法不起作用是有意义的。只有当选项页面启动时,Options.html才会一直“活着”。因此,它无法侦听来自内容脚本的请求。 这正是“背景”的用途。
至于第一种方法(使用getBackgroundPage()),我自己从未使用过这种方法,但它似乎只带回了后台页面的DOM,因此你无法访问后台js中的变量。
您的最佳镜头应该是从选项页面向背景页面发送请求,询问此值,例如:
内容脚本:
chrome.extension.sendRequest({greeting: "retrieveAddr"}, function(response) {
// do something with response.addr...
});
背景页面:
chrome.extension.onRequest.addListener(
function(request, sender, sendResponse) {
switch (request.greeting) {
case "maprender"):
alert("reached here sendin resp"+request.name);
Addr_details.place = request.name;
sendResponse({farewell: "goodbye"});
break;
case "retrieveAddr":
sendResponse({addr: Addr_details});
default:
sendResponse({}); // snub them.
});
});
另一个更简单但更黑客的解决方案是使用localStorage在选项和背景页面之间传递信息,因为它们共享相同的信息。