关闭 Excel add-in/file/program 的事件或检查 opener 是否还活着

Close event of Excel add-in/file/program or check if the opener is still alive

我正在制作 Excel JavaScript API 的 Excel 插件。此插件中有一个按钮,单击它会启动 window.open("https://localhost:3000/#/new/", "popup", "width=1000, height=1100") 并弹出浏览器 window。

新页面由angularjs构建。它可以通过 $window.opener.postMessage(msg, $window.opener.location.href)postMessage 发送到加载项开启程序。现在,我想在页面中添加一个实时 flag 来指定页面是否连接到它的 opener 加载项。

比如弹出新页面时,flag显示connected。如果我们关闭Excel文件(例如关闭Windows中的Excel程序,关闭Excel在线的浏览器选项卡,通常弹出浏览器window没有系统地关闭,但我们希望标志显示 disconnected.

有谁知道ExcelJavaScriptAPI有没有close events of add-in/file/program。如果是这样,我们可以在触发事件时通过 postMessage 从加载项向弹出式浏览器 window 发送一条消息。

否则,在弹出式浏览器一侧 window,检测其开启者是否仍然存在的有效方法是什么?

您是否希望 弹出窗口有时保持打开状态(并说断开连接)?或者您希望在主机加载项关闭时自动关闭它?如果你想要后者,那么使用 Dialog API.

我感觉常规卸载事件应该有效。所以将 $window 服务注入你的控制器并设置 onbeforeunload 来设置你的标志。

app.controller("MyFlagChangerController", function ($scope, $window...)){
  $window.onbeforeunload = function (event) {
  // Set flag   
  }
});

另一种方法是通过套接字。当套接字停止通信时,您会知道连接已断开,但这是一个成本更高的解决方案,我猜简单的 JS 卸载应该可以工作。

我还没有找到如何监听 Excel add-in/file/program 的关闭事件,但我找到了如何检测弹出窗口的开启者是否仍然存在:

$window.opener !== null

这很简单而且似乎是正确的(到目前为止)。

然后,至少,我们可以使用被动方式来检查开启者是否还活着,例如,通过心跳,或者当没有return 发送的消息...