Допустим, я делаю дополнение / расширение для 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");
}
Итак, я снова пытаюсь завершить выполнение кода javascript даже после закрытия родительской html-страницы. Кажется, что это должно быть легко, так как я загружаю скрипт как content_script, так и фоновый скрипт, но я не могу понять это, и нет подходящих SO сообщений. Любая помощь приветствуется.