如果我的网页未在任何选项卡中打开,则禁用通知

Posted

技术标签:

【中文标题】如果我的网页未在任何选项卡中打开,则禁用通知【英文标题】:Disable notification if my webpage is not open in any tab 【发布时间】:2021-03-17 09:52:53 【问题描述】:

如果我的网站标签已关闭,我想禁用通知。我怎样才能做到这一点?

这是显示 Firebase 推送通知的代码。

const messaging = firebase.messaging();

//Code for show webpage background notification
messaging.setBackgroundMessageHandler(function(payload) 
   //Code for show notifications
);

//Code for show webpage foreground notification
messaging.onMessage(function(payload) 
   //Code for show notifications
);

我只想在网页打开时显示通知。如果网页未在任何选项卡中打开,我必须禁用通知。

帮帮我,我怎样才能做到这一点?

【问题讨论】:

【参考方案1】:

我认为最接近你想要的是:

    检测您的页面何时被卸载

window.addEventListener('unload', e => ... )

    通过您的推送通知管理器取消订阅 来自 MDN 的代码,不是我的
navigator.serviceWorker.ready.then(function(reg) 
  reg.pushManager.getSubscription().then(function(subscription) 
    subscription.unsubscribe().then(function(successful) 
      // You've successfully unsubscribed
    ).catch(function(e) 
      // Unsubscription failed
    )
  )
);

请注意,这需要您在每次加载页面时重新订阅推送服务。

【讨论】:

感谢您的回答。但是,在刷新页面和返回按钮上也会调用卸载事件。而在 chrome 中,卸载事件仅检测用户何时单击窗口中的任何点。 的确如此,但是如果你想用ServiceWorkers来检测是否有人关闭你的页面,AFAIK是唯一的方法,否则我认为@Frank提出的方法是最实用的。【参考方案2】:

如果您只想在页面打开时传递通知,请考虑使用 FCM 以外的其他传递机制。我建议看一下Firebase Realtime Database 之类的东西,它可以在不需要服务人员的情况下使用(因为它只在页面打开时工作)。

【讨论】:

以上是关于如果我的网页未在任何选项卡中打开,则禁用通知的主要内容,如果未能解决你的问题,请参考以下文章

使用角度导航时,在新选项卡中打开链接未在新选项卡中打开

如果已在另一个选项卡中打开,则阻止打开 html

rails timelinejs 未在引导选项卡中正确加载

如何在通知选项卡中单击推送通知消息打开特定片段?

Vue.js:如何在已打开的选项卡中打开外部链接?

如何在 Visual Studio Code 的新选项卡中打开文件