我需要创建一个chrome扩展名,以捕获当前的可见标签并在新标签中打开它。我使用以下代码:
send.js
function openNextPage(imagesrc) {
chrome.tabs.create({url: "newScreen.html"},function(tab){
chrome.runtime.sendMessage({someParam: imagesrc},function(response){console.log(response);});
}
);
}
在 newScreen.html 中,我包括了 receive.js ,如下所示:
window.addEventListener("load",function(){
console.log('contents Loaded');
chrome.runtime.onMessage.addListener(function(request,sender,response) {
console.log(request.someParam);
});
});
问题是,一旦创建了新标签(第一个 newScreen.html ),我就可以看到内容已加载消息,但看不到 imagesrc 。可能是因为onMessage.addEventListener稍后(在sendMessage之后)执行。
但是,如果我再次单击扩展名并打开第二个 newScreen.html ,则上一个 newScreen.html 会收到该消息并进行打印。如果我打开第三个标签,则第一个和第二个标签将再次收到该消息。问题是即使在添加onMessageListener之前,sendMessage也会执行。我将TimeOut用于sendMessage,但徒劳无功。帮帮我!
最佳答案
你是说
是的,这是事实:您正在使用window.onload
侦听器等待窗口加载,但是在窗口完全加载之前,已发送消息。您应该将chrome.runtime.onMessage
侦听器放在window.onload
侦听器之外,如下所示:chrome.runtime.onMessage.addListener(function(request,sender,response) {
console.log(request.someParam);
});
window.addEventListener("load",function(){
console.log('contents Loaded');
});
如果需要,可以将请求存储在某个全局变量中,以便可以在window.onload
事件处理程序中使用该请求,并确保在加载窗口后完成所有工作,如下所示:var MY_PARAMETER;
chrome.runtime.onMessage.addListener(function(request,sender,response) {
MY_PARAMETER = request.someParam;
});
window.addEventListener("load",function(){
// Now you are sure that the window is loaded
// and you can use the MY_PARAMETER variable
console.log("Contents loaded, MY_PARAMETER =", MY_PARAMETER);
});
显然,您需要将此receive.js
脚本放在标记的顶部,即文档的<head>
内,以确保尽快添加侦听器:<html>
<head>
...
<script src="/path/to/request.js"></script>
...
</head>
...
</html>