我有一个chrome扩展,它通过内容脚本注入了一些DOM事件侦听器。我想在用户停用插件的情况下从 DOM 中删除这些事件侦听器,有没有办法这样做?
这是一个有趣的问题。它与"孤立"脚本的概念有关。我在这里的增编中详细讨论了这些内容。
问题是,一旦脚本与父扩展程序分离,Chrome API 就会失败。因此,检测这一点并不简单。
有许多可能的方法:
-
保持后台页面的开放端口。如果后台页面不复存在,端口将触发
onDisconnected
事件。这是一种基于事件的方法 - 您将能够立即做出反应。
但这有一个重要的缺点:维护一个开放的端口将阻止事件页面卸载。因此,如果您使用非持久性背景页面,这不是最佳选择。
-
定期,或者更好的是 - 在你的处理程序开始时,尝试使用 Chrome API 做一些事情。这将失败,您可以捕获异常并假定扩展是孤立的。
请注意,这几乎是未定义的行为。Chrome API 的反应方式可能会随着时间的推移而改变。
function heartbeat(success, failure) { try { if(chrome.runtime.getManifest()) { success(); } else { // will return undefined in an orphaned script failure(); } } catch(e) { // currently doesn't happen, but may happen failure(); } } function handler() { heartbeat( function(){ // hearbeat success /* Do stuff */ }, function(){ // hearbeat failure someEvent.removeListener(handler); console.log("Goodbye, cruel world!"); } ); } someEvent.addListener(handler);
-
最后,有人提议为这种情况举办一个特殊事件,但尚未实施。
-
特别是对于重新加载扩展时的更新,您可以让它将脚本注入现有页面,并让旧脚本知道它们应该停用;但是,由于您的问题是关于删除扩展,因此它没有帮助。
完成困难的部分后,事件侦听器的实际删除取决于您如何添加它们,但应该很简单。
-
on禁用在应用或扩展程序被停用时触发。
chrome.management.onDisabled.addListener(function callback)
-
EventTarget.removeEventListener(( 会删除之前注册的事件侦听器。
var div = document.getElementById('div'); var listener = function (event) { /* do something here */ }; div.addEventListener('click', listener, false); div.removeEventListener('click', listener, false);
-
我认为您不需要这样做,因为一旦您的扩展被禁用,您的事件侦听器将被删除并且不会被注入。