2016-10-20 14 views
1

ページが読み込まれるたびにサービスワーカーにメッセージを送信します。サービスワーカーのコントローラ交換は一切実行されません。

最初にページがロードされると、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); 
}); 

答えて

1

私はサービスワーカーをpostMessaging開始することができたときにどのように私は知っていますか?あなたは、なぜあなたcontrollerchangeイベントリスナーの底に取得したいならば

// 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. 
navigator.serviceWorker.ready.then(registration => 
    registration.active.postMessage('ping'); 
}); 

:私はnavigator.serviceWorker.ready約束を利用し、次のアプローチを、お勧めします:ちょうどそのビットに焦点を当て

あなたのサービスワーカーのactivateイベントでclients.claim()を使用していないと考えられます。つまり、新しくアクティブになったサービスワーカーは、現在のページを管理しません。

関連する問題