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

时间:2018-06-28 04:11:34

标签: javascript google-chrome firefox-addon firefox-webextensions

所以可以说我正在为firefox / chrome添加插件/扩展名。我有一键弹出窗口。看起来像这样:

enter image description here

单击该按钮时,我希望某些功能执行,并且我希望它继续执行,即使在弹出窗口失去焦点并消失之后。

正常的行为是在失去焦点后立即关闭弹出窗口。因此,如果我单击按钮,然后立即单击其他内容,则弹出窗口消失,并且在控制台中收到此消息:

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"]
    }]
}

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");
}

因此,即使关闭了父html页面,我仍在尝试完成执行javascript代码。看起来这应该很容易,因为我将脚本同时作为content_script和背景脚本加载,但是我无法弄清楚,也没有匹配的SO帖子。任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:1)

您应该messaging使用Chrome。 按下按钮时,popup将向background发送消息,而background将收听并执行某些操作。

仅使用popup page就无法做到。 而且,如果您想对active page进行操作,则需要在该页面中创建侦听器(使用content_scripts添加脚本)。