Javascript 如何在弹出窗口关闭后保持扩展脚本运行?

Javascript 如何在弹出窗口关闭后保持扩展脚本运行?,javascript,google-chrome,firefox-addon,firefox-addon-webextensions,Javascript,Google Chrome,Firefox Addon,Firefox Addon Webextensions,假设我正在为firefox/chrome制作一个插件/扩展。我有一个带有一个按钮的弹出窗口。看起来是这样的: 当点击按钮时,我希望执行一些功能,我希望即使在弹出窗口失去焦点并消失后,它仍能继续执行 正常行为是在弹出窗口失去焦点时立即关闭它。因此,如果我单击按钮,然后立即单击其他内容,弹出窗口将消失,我会在控制台中看到以下消息: Cannot send function call result: other side closed connection (calldata: ({path:"bo

假设我正在为firefox/chrome制作一个插件/扩展。我有一个带有一个按钮的弹出窗口。看起来是这样的:

当点击按钮时,我希望执行一些功能,我希望即使在弹出窗口失去焦点并消失后,它仍能继续执行

正常行为是在弹出窗口失去焦点时立即关闭它。因此,如果我单击按钮,然后立即单击其他内容,弹出窗口将消失,我会在控制台中看到以下消息:

Cannot send function call result: other side closed connection (calldata:
({path:"bookmarks.getTree", args:[]}))
检查或使用onbeforeunload工作时没有错误

下面是一个简单的例子:

Manifest.json

{
    "manifest_version": 2,
    "name": "delete bookmarks",
    "version": "0.1",
    "browser_action": {
        "default_popup": "popup.html"
    },
    "permissions": ["management", "bookmarks", "http://*/"],
    "background": {
        "scripts": ["doStuff.js"]
    },
    "content_scripts": [{
        "matches": ["<all_urls>"],
        "js": ["doStuff.js"]
    }]
}
{
“清单版本”:2,
“名称”:“删除书签”,
“版本”:“0.1”,
“浏览器操作”:{
“默认弹出窗口”:“popup.html”
},
“权限”:[“管理”、“书签”、“http://*/”],
“背景”:{
“脚本”:[“doStuff.js”]
},
“内容脚本”:[{
“匹配项”:[“”],
“js”:[“doStuff.js”]
}]
}
popup.html

<!DOCTYPE html>
<html>
    <button id="doStuff">doStuff</button>
    <script src="doStuff.js"></script>
</html>

多斯塔夫
doStuff.js

var button = document.getElementById("doStuff");
button.addEventListener("click", function() {
  doStuff();
}, false); 

function doStuff(){
  chrome.bookmarks.getTree(deleteAllBookmarks);
}

function deleteAllBookmarks(result){  //JUST AN EXAMPLE!
 //delete/remove ALL bookmarks
  for(var i = 0 ; i < result[0].children.length; i ++){  //get children of root 
    var child = result[0].children[i];
    for(var j = 0 ; j < child.children.length; j++){  //get children of children of root 
      var childchild = child.children[j];
      console.log("deleting id " + childchild.id);
      chrome.bookmarks.removeTree(childchild.id, success);  //delete everything
    }
  }
}

function success(result){
  alert("Success");
}
var按钮=document.getElementById(“doStuff”);
addEventListener(“单击”,函数(){
doStuff();
},假);
函数doStuff(){
chrome.bookmarks.getTree(deleteAllBookmarks);
}
函数deleteAllBookmarks(result){//只是一个例子!
//删除/删除所有书签
对于(var i=0;i
因此,我再次尝试在父html页面关闭后完成javascript代码的执行。看起来这应该很容易,因为我正在加载脚本作为内容脚本和背景脚本,但我无法理解它,并且没有匹配的SO帖子。非常感谢您的帮助。

您应该使用chrome。 按下按钮时,
弹出窗口
将向
后台
发送消息,
后台
将监听并执行操作

如果只使用
弹出页面
,则无法执行此操作。
如果您想使用
活动页面
,则需要在该页面中创建侦听器(使用
内容脚本添加脚本
)。

您不应将同一JS文件用于弹出JS、背景脚本和内容脚本。你最好每个目的都有一个文件。然后,弹出式触发器检测到单击按钮,向执行长时间处理的后台脚本发送消息,并可以将消息发送回弹出式触发器。看看我的答案,我在这里解释了这个过程,它应该会有帮助: