所以可以说我正在为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"]
}]
}
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帖子。任何帮助表示赞赏。
答案 0 :(得分:1)
您应该messaging使用Chrome。
按下按钮时,popup
将向background
发送消息,而background
将收听并执行某些操作。
仅使用popup page
就无法做到。
而且,如果您想对active page
进行操作,则需要在该页面中创建侦听器(使用content_scripts
添加脚本)。