2017-12-28 8 views
0

Unten ist mein fcm setBackgroundMessageHandler Funktion:Get-Dokument in setBackgroundMessageHandler Funktion von fcm

messaging.setBackgroundMessageHandler(function(payload) { 
    console.log('[firebase-messaging-sw.js] Received background message ', payload); 
    // Customize notification here 
    const notificationTitle = 'Background Message Title'; 
    const notificationOptions = { 
    body: 'Background Message body.', 
    icon: '/firebase-logo.png' 
    }; 
var event = new CustomEvent("name-of-event", payload); 

// Dispatch/Trigger/Fire the event 
document.dispatchEvent(event); 
    return self.registration.showNotification(notificationTitle, 
     notificationOptions); 
}); 

Ich kann keine document in obigem Verfahren zuzugreifen. Ich habe versucht, Dokument in globaler Variable zu speichern und auf es innerhalb der oben genannten Methode zuzugreifen, aber es funktioniert nicht.

var document = document; 
. 
. 
. 
document.dispatchEvent(event); // gives error: dispatchEvent of undefined 
+1

Soweit ich Ihr Hintergrund-Handler läuft in einem Service kennen:

var listener = new BroadcastChannel('listener'); listener.onmessage = function(e) { console.log('Got message from service worker',e); }; 

In service worker js Datei Verwendung BroadcastChannel ‚s postMessage Funktion Nachricht zur Hauptseite senden Worker, der keinen Zugriff auf das DOM hat. Sie verwenden 'postMessage()', um Nachrichten zwischen dem Service-Worker und der Hauptseite zu senden. Siehe https://stackoverflow.com/questions/37704641/access-dom-by-web-worker –

+0

@FrankvanPuffelen Dank –

+0

@FrankvanPuffelen gibt es eine Möglichkeit, die Benachrichtigung in 'setBackgroundMessageHandler' zu verhindern –

Antwort

1

Da document nicht in Service Worker zugänglich ist. Es gibt also keine Möglichkeit, die dispatchEvent-Funktion zu verwenden, um ein Ereignis an die Hauptseite zu senden.

Zum Senden einer Nachricht von Service Worker an Main page können wir BroadcastChannel verwenden. In Startseite einen Listener wie folgt erstellen:

var listener = new BroadcastChannel('listener'); 
listener.postMessage('It works !!'); 
Verwandte Themen