Google chrome extension Chrome扩展:在弹出窗口关闭时检测

Google chrome extension Chrome扩展:在弹出窗口关闭时检测,google-chrome-extension,popup,Google Chrome Extension,Popup,对于我的chrome扩展,我想在browserAction弹出窗口关闭时执行一个操作。我知道发生这种情况时不会触发内置事件。我发现要用后台脚本打开一个连接,然后使用连接的端口.onDisconnect事件检测弹出窗口是否关闭 但是,当弹出窗口关闭时,我在后台脚本的开发人员控制台中看到以下错误: (BLESSED_EXTENSION context for glkehflnlfekdijfhacccflbffbjhgbd) extensions::messaging:102: Uncaught T

对于我的chrome扩展,我想在browserAction弹出窗口关闭时执行一个操作。我知道发生这种情况时不会触发内置事件。我发现要用后台脚本打开一个连接,然后使用连接的
端口.onDisconnect
事件检测弹出窗口是否关闭

但是,当弹出窗口关闭时,我在后台脚本的开发人员控制台中看到以下错误:

(BLESSED_EXTENSION context for glkehflnlfekdijfhacccflbffbjhgbd) extensions::messaging:102: Uncaught TypeError: Cannot read property 'destroy_' of undefined{TypeError: Cannot read property 'destroy_' of undefined
   at PortImpl.destroy_ (extensions::messaging:102:37)
   at dispatchOnDisconnect (extensions::messaging:322:29)}
下面详细介绍了我使用的脚本

你能看出我错在哪里吗


manifest.json

{ "manifest_version": 2

, "name": "Detect when popup closes"
, "version": "0.1"

, "browser_action": {
    "default_icon": "popup.png"
  , "default_popup": "popup.html"
  }

, "background": {
    "scripts": [
      "background.js"
    ]
  }
}
popup.html

<!DOCTYPE html>
<body>
  <h1>Test</h1>

  <script src="popup.js"></script>  
</body>
</html>
background.js

chrome.runtime.onConnect.addListener(function (externalPort) {
  externalPort.onDisconnect = function () {
    try { 
      var ignoreError = chrome.runtime.lastError
    } catch (error) {
      console.log("onDisconnect")
    }
  }
)

onDisconnect
不是可分配的属性。
它是一个提供注册回调的
addListener
方法的对象:

externalPort.onDisconnect.addListener(函数(){
var ignoreError=chrome.runtime.lastError;
console.log(“onDisconnect”);
});

以下是background.js脚本的工作版本供参考:

chrome.runtime.onConnect.addListener(function (externalPort) {
  externalPort.onDisconnect.addListener(function () {
    console.log("onDisconnect")
    // Do stuff that should happen when popup window closes here
  })

  console.log("onConnect")
})

建议在后台脚本中检测事件。端口已断开连接,因为弹出窗口已被破坏,因此在端口断开连接时没有可调用的事件侦听器。@wOxxOm我已重写了我的基本扩展,以便按照您的建议在后台脚本中使用
port.onDisconnect
。但是,这只是将错误移到弹出窗口关闭的时刻。这种情况下的错误是记录在案的,可以通过简单赋值
var ignoreError=chrome.runtime.lastError
忽略。重要的是,断开连接的侦听器实际上会启动。@wOxxOm我已经添加了您建议的任务,但我怀疑我是否将其放在了正确的位置。也许断开连接侦听器会启动,但错误使我无法让它执行任何有用的操作。@JamesNewton我回滚了您的“已解决”编辑;将来,请把你自己的解决方案(如果合适的话)作为一个单独的答案贴出来——自答是绝对可以的,但把答案和问题混合起来是不行的。此外,没有必要在标题中将您的问题标记为已解决(有一个可接受的答案就足够了)。我还建议将
externalPort
保存到外部范围内的变量中;我认为,否则它就有垃圾收集的风险。是的,但只是为了以后修改端口的行为。侦听器本身已在浏览器内部注册,因此它将保留。当弹出窗口关闭时,如何启动
.onDisconnect
?每当我实现它时,它只在实际的扩展被卸载时才会触发。它应该在后台页面中。@wOxxOm是否可以将onDisconnect侦听器放在内容脚本中而不是放在
background.js
中?我试过了,但没能成功。这将节省我创建另一个要注入的脚本的时间,因为我希望在关闭弹出窗口时运行的方法驻留在内容脚本中。
chrome.runtime.onConnect.addListener(function (externalPort) {
  externalPort.onDisconnect.addListener(function () {
    console.log("onDisconnect")
    // Do stuff that should happen when popup window closes here
  })

  console.log("onConnect")
})