我正在开发Chrome 4(目前为4.0.249.0)的扩展程序,该扩展程序将在状态栏中显示用户的StackOverflow / SuperUser / ServerFault信誉。我设计了一个选项页面来获取用户的个人资料ID,然后将它们保存到localStorage并在扩展中很好地阅读它们。一切都很好。
问题是我找不到一种(程序化的)方法来在保存选项时刷新扩展名。我试图在点击它时从扩展页面调用location.reload();
- 无济于事。我进一步追求它,并尝试查看Chrome的chrome://extensions/
页面重新加载扩展程序的内容,并找到了此代码:
/**
* Handles a 'reload' button getting clicked.
*/
function handleReloadExtension(node) {
// Tell the C++ ExtensionDOMHandler to reload the extension.
chrome.send('reload', [node.extensionId]);
}
将此代码复制到我的事件处理程序没有帮助(是的,我尝试用实际代码替换[node.extensionId]
)。有人可以帮助我以正确的方式做这件事,或者指点我正确执行此操作的扩展代码吗?完成后,我会将扩展及其来源放在我的博客上。
答案 0 :(得分:33)
现在,对重新加载进行扩展的最简单方法是调用chrome.runtime.reload()
。此功能不需要清单中的任何权限。
要重新加载另一个扩展名,请使用chrome.management.setEnabled()
。它需要“permissions”:清单中的[“management”] 。
答案 1 :(得分:5)
扩展程序的javascript代码无法访问chrome.send函数,newtab页面,历史记录和扩展页面等页面使用它来与这些页面的C ++控制器代码进行通信。
您可以将扩展程序的更新推送给安装了该扩展程序的用户,如here所述。一旦命中自动更新间隔或重新启动浏览器,将更新用户的应用程序。但是,您无法以编程方式重新加载用户的扩展。我认为这会带来安全隐患。
答案 2 :(得分:3)
我在an extension时遇到了同样的问题。
事实证明,您可以使用chrome.storage.onChanged
在background.js
内监听存储更改,并执行刷新逻辑。
例如:
// Perform a reload any time the user clicks "Save"
chrome.storage.onChanged.addListener(function(changes, namespace) {
chrome.storage.sync.get({
profileId: 0
}, function(items) {
// Update status bar text here
});
});
您还可以通过考虑changes
参数,以这种方式重新加载扩展程序的部分。 chrome.runtime.reload()
可能会更容易,但这会减少开销。
答案 3 :(得分:2)
window.location.reload()适合我
我正在使用chrome 6.x,因此可能会在较新版本中修复
答案 4 :(得分:0)
对于所有未来的Google员工-浏览器扩展规范现在包括runtime.reload()
-https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/runtime/reload
对于Chrome,您可能需要使用chrome.runtime.reload()
(但我会通过Mozilla出色的webextension-polyfill
处理此类情况)。