在 Chrome 扩展程序中,如何在停用时触发事件



我有一个chrome扩展,它通过内容脚本注入了一些DOM事件侦听器。我想在用户停用插件的情况下从 DOM 中删除这些事件侦听器,有没有办法这样做?

这是一个有趣的问题。它与"孤立"脚本的概念有关。我在这里的增编中详细讨论了这些内容。

问题是,一旦脚本与父扩展程序分离,Chrome API 就会失败。因此,检测这一点并不简单。

有许多可能的方法:

  1. 保持后台页面的开放端口。如果后台页面不复存在,端口将触发onDisconnected事件。

    这是一种基于事件的方法 - 您将能够立即做出反应。

    但这有一个重要的缺点:维护一个开放的端口将阻止事件页面卸载。因此,如果您使用非持久性背景页面,这不是最佳选择。

  2. 定期,或者更好的是 - 在你的处理程序开始时,尝试使用 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);
    
  3. 最后,有人提议为这种情况举办一个特殊事件,但尚未实施。

  4. 特别是对于重新加载扩展时的更新,您可以让它将脚本注入现有页面,并让旧脚本知道它们应该停用;但是,由于您的问题是关于删除扩展,因此它没有帮助。

完成困难的部分后,事件侦听器的实际删除取决于您如何添加它们,但应该很简单。

  1. on禁用在应用或扩展程序被停用时触发。

    chrome.management.onDisabled.addListener(function callback)
    
  2. EventTarget.removeEventListener(( 会删除之前注册的事件侦听器。

    var div = document.getElementById('div');
    var listener = function (event) {
      /* do something here */
    };
    div.addEventListener('click', listener, false);
    div.removeEventListener('click', listener, false);
    
  3. 我认为您不需要这样做,因为一旦您的扩展被禁用,您的事件侦听器将被删除并且不会被注入。

相关内容

  • 没有找到相关文章

最新更新