Start · Sprachen · JavaScript · Referenz · new NotificationEvent()

new NotificationEvent()

Methode

Erstellt ein neues <code>NotificationEvent</code>-Objekt, wie es der Browser bei <code>notificationclick</code> und <code>notificationclose</code> im Service Worker auslöst.

seit JavaScript Baseline: Chrome, Edge, Firefox; Safari 16+ (nur i Kategorie: webapi

Signatur

new NotificationEvent(type, options)

Beschreibung

Der Konstruktor NotificationEvent() erzeugt ein Ereignisobjekt vom Typ NotificationEvent. Diese Schnittstelle erweitert ExtendableEvent. Sie steht nur im Service-Worker-Kontext (ServiceWorkerGlobalScope) zur Verfügung. Im Fenster-Kontext ist NotificationEvent nicht definiert.

Normalerweise erzeugt der Browser solche Ereignisse selbst: notificationclick, wenn jemand auf eine Benachrichtigung oder einen ihrer Aktions-Buttons klickt, und notificationclose, wenn sie geschlossen wird. Selbst ruft man den Konstruktor vor allem in Unit-Tests für die Handler auf, oder wenn man die Klick-Logik absichtlich per self.dispatchEvent() auslösen will, etwa um Code wiederzuverwenden.

Das Pflichtfeld notification im Optionsobjekt muss ein echtes Notification-Objekt sein. Im Service Worker bekommt man es in der Regel über self.registration.getNotifications(). Mit new Notification() geht das dort nicht, denn der Aufruf wirft im Service Worker einen TypeError.

Parameter

Name Typ Default Beschreibung
$type Pflicht string Name des Ereignisses, üblicherweise "notificationclick" oder "notificationclose". Groß- und Kleinschreibung werden unterschieden.
$options Pflicht NotificationEventInit Objekt zur Initialisierung. Zusätzlich zu den Feldern aus ExtendableEventInit (bubbles, cancelable, composed, alle standardmäßig false) gibt es:
  • notification (Notification, Pflicht): die betroffene Benachrichtigung.
  • action (string, Standard ""): die ID des angeklickten Aktions-Buttons. Eine leere Zeichenkette bedeutet, dass die Benachrichtigung selbst angeklickt wurde.

Rückgabewert

Typ
NotificationEvent
Beschreibung
Ein neues NotificationEvent. Seine Eigenschaften notification und action enthalten die übergebenen Werte, und es erbt waitUntil() von ExtendableEvent.

Beispiele

Ereignis mit einer bestehenden Benachrichtigung erzeugen

// sw.js – läuft im Service Worker
const createClickEvent = async () => {
  const [notification] = await self.registration.getNotifications({ tag: 'chat' });
  if (!notification) return null;

  const event = new NotificationEvent('notificationclick', {
    notification,
    action: 'reply'
  });
  console.log(event.type, event.action, event.notification.tag);
  return event;
};

createClickEvent();
notificationclick reply chat

Klick-Handler per dispatchEvent wiederverwenden

// sw.js
self.addEventListener('notificationclick', (event) => {
  event.notification.close();
  const url = event.action === 'open-inbox' ? '/inbox' : '/';
  event.waitUntil(self.clients.openWindow(url));
});

// Nachricht aus der Seite: "so tun, als wäre geklickt worden"
self.addEventListener('message', async (msg) => {
  if (msg.data?.type !== 'simulate-click') return;
  const [notification] = await self.registration.getNotifications();
  if (notification) {
    self.dispatchEvent(new NotificationEvent('notificationclick', {
      notification,
      action: 'open-inbox'
    }));
  }
});

Handler-Logik testen, ohne dass eine Aktion gewählt wurde

// sw.js – einfacher Selbsttest
const handleClose = (event) => {
  console.log(`Geschlossen: ${event.notification.title} (Aktion: "${event.action}")`);
};
self.addEventListener('notificationclose', handleClose);

const runSelfTest = async () => {
  await self.registration.showNotification('Test-Hinweis', { tag: 'selftest' });
  const [notification] = await self.registration.getNotifications({ tag: 'selftest' });
  self.dispatchEvent(new NotificationEvent('notificationclose', { notification }));
};

runSelfTest();
Geschlossen: Test-Hinweis (Aktion: "")

// Wichtig · Fallstricke

  • Nur im Service Worker verfügbar: Im Fenster- oder Worker-Kontext ist NotificationEvent nicht definiert. Wer es dort verwendet, bekommt einen ReferenceError.
  • notification ist Pflicht: Fehlt das Feld oder ist es kein Notification-Objekt, wirft der Konstruktor einen TypeError. Das Objekt holt man über registration.getNotifications(). new Notification() ist im Service Worker nicht erlaubt.
  • Selbst erzeugte Ereignisse sind nicht „vertrauenswürdig“: event.isTrusted ist false. Der Browser wertet sie nicht als Nutzerinteraktion. Deshalb schlagen clients.openWindow() und WindowClient.focus() in der Regel fehl (InvalidAccessError), weil dafür eine echte Nutzeraktion nötig ist.
  • waitUntil() darf man nur aufrufen, solange das Ereignis gerade verarbeitet wird. Sonst gibt es einen InvalidStateError. Bei selbst ausgelösten Ereignissen verlängert der Aufruf die Lebensdauer des Service Workers nicht zuverlässig.
  • Kompatibilität: Chromium-Browser und Firefox unterstützen den Konstruktor seit Langem. Safari unterstützt ihn ab Version 16 (macOS) bzw. 16.4 (iOS, nur bei installierten Web-Apps). Die Eigenschaft reply gab es nur in älteren Chrome-Versionen, sie ist nicht standardisiert.