Angular 2+检测关闭窗口

时间:2018-12-03 13:45:56

标签: javascript angular angular6 window-object

在完成构建后 ,我遇到麻烦。

const newWindow = window.open(url, '_blank', options);
newWindow.onbeforeunload = () => null;
newWindow.addEventListener('beforeunload', (evt: BeforeUnloadEvent) => 
  {
    console.log(evt)
  }
);

在我进行构建之前,它一直很好用,在那之前不会触发beforeunload事件。我还尝试将主机侦听器放置在新窗口的组件中:

@HostListener('window:beforeunload', [ '$event' ])
beforeUnloadHander(event: BeforeUnloadEvent): void {
  debugger;
}

但是这里有同样的问题。构建完成后,我们就不再到达调试器了

有人知道我在做什么错吗?谢谢您的帮助!

编辑解决方法

const heartBeatNewWindow = setInterval(() => {
  if (newWindow.closed) {
    this.canvasSettings.displayInNewWindow = false;
    clearTimeout(heartBeatNewWindow);
  }
}, 1500);

1 个答案:

答案 0 :(得分:0)

我必须做类似的事情,而我的方法是: 我从服务的构造函数中的关闭事件窗口创建了一个通用捕获,它们调用处理该事件的方法。在此方法内部,我确认此事件的起源是执行所需逻辑的正确方法。看这个例子:

在构造函数内部:

  if(window.addEventListener){
     window.addEventListener("message", this.authService.handleMessage.bind(this), false);
  }else{
     (<any>window).attachEvent('onmessage', this.authService.handleMessage.bind(this));
}

我处理该事件的方法:

handleMessage(event: Event) {
      event.preventDefault();
      const message = event as MessageEvent;

        // Only trust messages from the below origin.
        //
        if ((message.origin !== environment.BASE_URL)) return;

      const result = JSON.parse(message.data);

//Add your logic here

希望能对您有所帮助。