Service Worker controllerchange 永远不会触发 [英] Service Worker controllerchange never fires

查看:47
本文介绍了Service Worker controllerchange 永远不会触发的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想在每次页面加载时向 Service Worker 发送一条消息.

I want to send a message to a service worker every time the page loads.

页面第一次加载时调用 register(),然后在 navigator.serviceWorker 上监听controllerchange"事件,但这永远不会触发.

The first time the page loads it calls register() and then listens for the "controllerchange" event on navigator.serviceWorker but this never fires.

我如何知道何时可以开始向 Service Worker 发送消息?

How do I know when I can start postMessaging a service worker?

navigator.serviceWorker.register(swURL).then(function(){
    var sw;

    if (navigator.serviceWorker.controller) {
        sw = navigator.serviceWorker.controller;
        sw.postMessage('ping');
        return;
    }

    function onchange(){
        sw = navigator.serviceWorker.controller;
        sw.postMessage('ping');
        navigator.serviceWorker.removeEventListener('controllerchange', onchange);
    }

    navigator.serviceWorker.addEventListener('controllerchange', onchange);
}).catch(function(err) {
    // registration failed :(
    console.log('ServiceWorker registration failed: ', err);
});

推荐答案

我如何知道何时可以开始向 Service Worker 发送消息?

How do I know when I can start postMessaging a service worker?

只关注这一点:我推荐以下方法,它利用了 navigator.serviceWorker.ready 承诺:

Just focusing on that bit: I'd recommend the following approach, which makes use of the navigator.serviceWorker.ready promise:

// navigator.serviceWorker.ready can be used from anywhere in your
// page's JavaScript, at any time.
// It will wait until there's an active service worker, 
// and then resolve with the service worker registration
navigator.serviceWorker.ready.then(registration => {
  registration.active.postMessage('ping');
});

如果您确实想了解 controllerchange 事件侦听器未触发的原因,我猜您没有使用 clients.claim() 在您的 Service Worker 的 activate 事件,这意味着新激活的 Service Worker 不会控制当前页面.

If you do want to get to the bottom of why your controllerchange event listener isn't firing, my guess would be that you're not using clients.claim() in your service worker's activate event, which means the newly-activated service worker won't take control of the current page.

这篇关于Service Worker controllerchange 永远不会触发的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆