重新加载Chrome扩展程序内容脚本执行环境

12

我希望模仿 window.location.reload() 的效果,但仅限于我的内容脚本所在的“隔离世界”。也就是说,删除所有现有的JS,特别是回调和事件绑定。有没有一种好的方法来做到这一点?

注意:chrome.runtime.reload() 对此无效;它会重新加载扩展和后台脚本,但不会重新加载现有的内容脚本,直到用户刷新。

1个回答

7
据我所知,在扩展程序更新期间,没有自动重新注入内容脚本的方法。您可以通过编程方式找到所有URL与所需模式匹配的选项卡,并使用 chrome.tabs.executeScript 重新注入内容脚本。
请注意,此方法需要添加与您的内容脚本使用的相同URL模式的权限。

Manifest.json:

"content_scripts":    
[
    {
        "matches": [ "http://*.google.com/*" ],
        "js": [ "content_script.js" ]
    }
], 
"permissions":        
[ 
    "tabs", "http://*.google.com/*"
]

Background.js:

chrome.runtime.reload();
chrome.tabs.query({ url: "http://*.google.com/*" }, function(tabs)
{
    for(var i = 0; i < tabs.length; i++)
    {
        chrome.tabs.executeScript(tabs[i].id, { file: "content_script.js" }, function() {});
    }
});

2
问题在于这样做不会改变现有的上下文。如果我在一个 executeScript 中启动 setInterval,它仍将在下一个 executeScript 执行后继续运行。 - Mispy
当第二个内容脚本再次执行时,您可以访问先前的变量,因此您可以重置所有内容。 - Métoule
1
@Metoule 当你从 chrome://extension 重新加载扩展程序后注入代码时,你将无法访问之前的变量。你测试过了吗? - vaughan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接