我希望能在每次页面加载时向服务工作者发送信息。
页面第一次加载时,它会调用register()方法,然后在navigator.serviceWorker上监听"controllerchange"事件,但该事件从未触发。
我该如何知道何时可以开始postMessaging到服务工作者?
页面第一次加载时,它会调用register()方法,然后在navigator.serviceWorker上监听"controllerchange"事件,但该事件从未触发。
我该如何知道何时可以开始postMessaging到服务工作者?
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);
});
navigator.serviceWorker.oncontrollerchange
和navigator.serviceWorker.ready
直到我清除了存储、关闭了选项卡并重新打开它们之前都没有触发。仅仅重新加载页面是没有帮助的。我遵循了这个人的建议:https://dev59.com/Q10a5IYBdhLWcg3w2717#v7GhEYcBWogLw_1b3GCU - GProstnavigator.serviceWorker.ready
解析时立即发出请求,SW将无法捕获这些请求,但是如果使用navigator.serviceWorker.oncontrollerchange
来进行,则可以捕获它们。通过在body
中附加脚本标签进行检查。 - GProstclients
.claim 但仍然无法工作,我已经尝试了你的方法,但仍然没有任何进展。有趣的是,它昨天还能正常工作... - Matteo