检查Service Worker中的窗口是否处于活动状态

时间:2017-07-17 17:53:20

标签: javascript php dom push-notification service-worker

我试图运行一个在窗口处于非活动状态时发送推送通知的Web应用程序。为此,我有一个服务工作者,可以帮助从我的php服务器(通过Firebase)接收通知。

但是,我不确定如何通过我的服务工作人员检查窗口是否处于活动状态。服务工作者无权访问DOM,因此我无法直接在那里检查它,并且我已尝试对附加的JS文件进行检查,但服务工作者获取的变量未定义错误。我的服务工作者代码如下:

self.addEventListener('push', function(event) {
  console.log('[Service Worker] Push Received.');
  // console.log(`[Service Worker] Push had this data: "${event.data.text()}"`);

  const title = 'Chat';
  const options = {
    body: 'New message received!',
    icon: '/images/logo/8-icon.png',
    badge: '/images/badge.png'
  };

  event.waitUntil(self.registration.showNotification(title, options));

});

self.addEventListener('notificationclick', function(event) {
  console.log('[Service Worker] Notification click Received.');

  event.notification.close();

  event.waitUntil(
    clients.openWindow('https://localhost:8000')
  );
});

如果网络应用处于活动状态,是否有人可以通过正确的方式检查活动窗口以防止推送通知?

谢谢!

2 个答案:

答案 0 :(得分:2)

您可以使用可见性API - > https://developer.mozilla.org/en-US/docs/Web/API/Page_Visibility_API?redirectlocale=en-US&redirectslug=DOM%2FUsing_the_Page_Visibility_API

在主页面上附加一个事件监听器以与您的服务工作者交谈。然后服务工作者可以相应地执行。

答案 1 :(得分:1)

即使您可以使用服务工作者窗口客户端API来检查网页是否可见或隐藏。

select * from
(select salesid,datename(month,salesdate) as mn,concat(employeename,'(',itemcode,')') as items from examplesales
) as S
pivot
(
count(salesid)
for items in  ([Michel John(A1)],[Mark Ven(A1)],[Michel John(A2)],[Mark Ven(A2)],
                            [Michel John(A3)],[Mark Ven(A3)],[Michel John(A4)],[Mark Ven(A4)])
                            ) p