Service Worker controllerchange永远不会触发
Service Worker controllerchange never fires
我想在每次页面加载时发送一个消息给service worker。
第一次加载页面时,它调用register(),然后监听navigator上的"controllerchange"事件。但它永远不会触发。
我怎么知道什么时候可以开始向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发送消息?
只关注这一点:我推荐以下方法,它利用了navigator.serviceWorker.ready
承诺:
// 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
事件监听器没有被触发,我的猜测是你没有在你的service worker的activate
事件中使用clients.claim()
,这意味着新激活的service worker不会控制当前页面。
没有触发的原因是你在 Service Worker已经安装/激活之后注册了controllerchange
事件。所以这个事件将触发new Service worker,例如使用skipWaiting()
的Service worker。但对初始Service Worker来说不是这样。
使用navigator.serviceWorker.ready
promise,一旦检测到活动的Service Worker,它就会解析,无论它是什么时候安装/激活的
相关文章:
- 在同一个服务工作者中处理service-worker.js有任何影响吗
- 成功回调永远不会被JSONP请求调用
- 使用Emscripten Worker API传输数据而不进行复制
- 永远不要停止gif预加载程序
- 当我尝试运行mocha测试时,没有定义Worker
- 在Service worker中使用setInterval
- UserInformation.getFirstNameAsync承诺永远不会实现
- 谷歌电子表格脚本:如何保存“;永远”;
- While循环在JavaScript中永远运行
- Web Worker postMessage({})何时返回给调用者
- 永远都不知道如何在twgl中进行纹理工作
- Web Worker 能否利用 100% 的多核 CPU
- 三.js:如何从Web-worker加载动画.json模型
- 我的链接按钮的OnClick事件永远不会被触发
- 从 Web Worker 执行 AJAX 请求是否可行
- 动态弹出窗口'通过调用一个永远运行并返回's每个周期后的数据
- 在Web Worker中将SVG转换为PNG
- 如何通过HTTPS加载Web Worker脚本
- 如何在不停止的情况下永远运行node-js
- Service Worker controllerchange永远不会触发