我有一个 chrome 扩展,它将 iframe 注入(inject)每个打开的选项卡中。我的 background.js 中有一个 chrome.runtime.onInstalled 监听器,它手动注入(inject)所需的脚本,如下所示(此处的 API 详细信息: http://developer.chrome.com/extensions/runtime.html#event-onInstalled ):
背景.js
var injectIframeInAllTabs = function(){
console.log("reinject content scripts into all tabs");
var manifest = chrome.app.getDetails();
chrome.windows.getAll({},function(windows){
for( var win in windows ){
chrome.tabs.getAllInWindow(win.id, function reloadTabs(tabs) {
for (var i in tabs) {
var scripts = manifest.content_scripts[0].js;
console.log("content scripts ", scripts);
var k = 0, s = scripts.length;
for( ; k < s; k++ ) {
chrome.tabs.executeScript(tabs[i].id, {
file: scripts[k]
});
}
}
});
}
});
};
当我第一次安装扩展时,这工作正常。我想在更新我的扩展时执行相同的操作。如果我在更新时也运行相同的脚本,我不会看到注入(inject)新的 iframe。不仅如此,如果我尝试在更新后向内容脚本发送消息,则没有任何消息会发送到内容脚本。我看到其他人也在 SO ( Chrome: message content-script on runtime.onInstalled ) 上遇到了同样的问题。 Chrome 扩展更新后删除旧内容脚本并注入(inject)新内容脚本的正确方法是什么?
最佳答案
更新扩展程序时,Chrome 会自动切断所有“旧”内容脚本与后台页面的通信,并且如果旧内容脚本确实尝试与运行时通信,它们也会引发异常。这对我来说是缺失的一 block 。我所做的只是在 bg.js
的 chrome.runtime.onInstalled
中,调用问题中发布的相同方法。这会注入(inject)另一个与正确的运行时对话的 iframe。在某个时间点,旧的内容脚本尝试与运行时通信,但失败了。我捕获了该异常并删除了旧的内容脚本。另请注意,每个 iframe 都被注入(inject)到自己的“隔离世界”(隔离世界解释如下: http://www.youtube.com/watch?v=laLudeUmXHM ),因此新注入(inject)的 iframe 无法清除旧的挥之不去的 iframe。
希望这对将来的人有帮助!
关于google-chrome-extension - 更新后重新注入(inject)内容脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18495615/