2017-10-03 5 views
0

は私がプッシュ通知のクリックイベントを処理するサービスワーカーを持っている:サービスワーカーのonClickイベント - スコープのあるウィンドウでURLを開くにはどうすればいいですか?

self.addEventListener('notificationclick', function (e) { 
    e.notification.close(); 

    e.waitUntil(
     clients.openWindow(e.notification.data.url) 
    ); 

}); 

通知はそれがデータからURLを取り、新しいウィンドウに表示しています。

コードは機能しますが、私は別の動作が必要です。ユーザーがリンクをクリックすると、サービスワーカスコープ内に開いているウィンドウがあるかどうかを確認する必要があります。はいの場合は、ウィンドウにフォーカスして、指定されたURLに移動する必要があります。

私はこれをチェックしましたanswerしかし、それは私が欲しいものではありません。

どうすればいいですか?

P.S.私はこのコードを書いたが、それでも動作しません。ただし、最初の2つのメッセージはログに表示されます。

+0

matchAllが返すクライアントをconsole.logにしてみてください。 forループの直前。クライアントの長さが0の場合、forループは決して実行されません。右は – pate

+0

です。もう一度やり直してください。クライアントは空ですので、matchUllに "includeUncontrolled:true"を追加しました。今すぐ "ServiceEleerイベントwaitUntil()が 'ReferenceError:givenUrlが定義されていません'と拒否された約束を渡しました。" –

答えて

1

あなたが正しく理解している場合、リンク先のコードのほとんどがここで動作します。

  • まずつ以上が存在する場合、すべてのクライアント
  • を取得し、どこかへと
エルス
  • 新しいウィンドウを開くに集中することをナビゲートし
    • それらのいずれかを選択します。

      右?

      event.waitUntil(
          clients.matchAll({type: 'window'}) 
          .then(clients => { 
           // clients is an array with all the clients 
           if (clients.length > 0) { 
           // if you have multiple clients, decide 
           // choose one of the clients here 
           const someClient = clients[..someindex..] 
           return someClient.navigate(navigationUrl) 
            .then(client => client.focus()); 
           } else { 
           // if you don't have any clients 
           return clients.openWindow(navigationUrl); 
           } 
          }) 
      ); 
      
  • +0

    はい、あなたは正しいです。私は同様のコードを書いていますが、それでも動作しません。私は質問を編集する –

    0

    ここでは、期待通りに動作するコードを示します。 scope_urlとredirect_urlをWeb通知に渡していることに注目してください。その後、scope_urlがswの場所の一部であるかどうかをチェックしています。その後、私はredirect_urlに移動します。

    self.addEventListener('notificationclick', function (e) { 
        e.notification.close(); 
        var redirectUrl = e.notification.data.redirect_url; 
        var scopeUrl = e.notification.data.scope_url; 
    
        e.waitUntil(
         clients.matchAll({includeUncontrolled: true, type: 'window'}).then(function(clients) { 
          for (i = 0; i < clients.length; i++) { 
            if (clients[i].url.indexOf(scopeUrl) !== -1) { 
             // Scope url is the part of main url 
             clients[i].navigate(redirectUrl); 
             clients[i].focus(); 
             break; 
            } 
          } 
         }) 
        ); 
    
    }); 
    
    関連する問題