Dieser Inhalt wurde automatisch aus dem Englischen übersetzt, und kann Fehler enthalten. Erfahre mehr über dieses Experiment.

View in English Always switch to English

Clients: openWindow()-Methode

Baseline
Weitgehend verfügbar

Diese Funktion ist gut etabliert und funktioniert auf vielen Geräten und in vielen Browserversionen. Sie ist seit April 2018 browserübergreifend verfügbar.

Hinweis: Diese Funktion ist nur in Service Workers verfügbar.

Die Methode openWindow() des Interfaces Clients erstellt einen neuen Browsing-Kontext der obersten Ebene und lädt eine angegebene URL. Wenn das aufrufende Skript keine Berechtigung zum Anzeigen von Pop-ups hat, löst openWindow() einen InvalidAccessError aus.

In Firefox darf die Methode Pop-ups nur anzeigen, wenn sie als Ergebnis eines Klickereignisses auf eine Benachrichtigung aufgerufen wird.

In Chrome für Android kann die Methode stattdessen die URL in einem vorhandenen Browsing-Kontext einer eigenständigen Web-App öffnen, die zuvor zum Startbildschirm des Benutzers hinzugefügt wurde. Seit Kurzem funktioniert dies auch in Chrome für Windows.

Syntax

js
openWindow(url)

Parameter

url

Ein String, der die URL des Clients darstellt, den Sie im Fenster öffnen möchten. Im Allgemeinen muss dieser Wert eine URL derselben Origin wie das aufrufende Skript sein.

Rückgabewert

Ein Promise, das zu einem WindowClient-Objekt aufgelöst wird, wenn die URL dieselbe Origin wie der Service Worker hat, oder andernfalls zu einem null-Wert.

Ausnahmen

InvalidAccessError DOMException

Das Promise wird mit dieser Ausnahme abgelehnt, wenn keines der Fenster in der Origin der App über eine transiente Aktivierung verfügt.

Sicherheitsanforderungen

Beispiele

Öffnen eines Fensters bei einem Klick auf eine Benachrichtigung

In diesem Beispiel erstellt ein Service Worker eine Benachrichtigung mit einer zugeordneten URL, die innerhalb des Geltungsbereichs des Service Workers liegt, und zeigt sie anschließend an. Wenn der Benutzer auf die Benachrichtigung klickt:

  • Wenn die Seite unter der URL der Benachrichtigung bereits geöffnet ist, fokussiert der Service Worker sie.
  • Andernfalls öffnet der Service Worker die Seite in einem neuen Fenster.

Beachten Sie, dass die Eigenschaft Client.url nicht aktualisiert wird, sofern nicht tatsächlich eine neue Seite geladen wird. Das bedeutet, dass sie nicht aktualisiert wird, wenn der Benutzer innerhalb derselben Seite mithilfe eines URL-Fragments navigiert oder wenn eine Single-Page-App (SPA) ein Navigationsereignis abfängt (beispielsweise mithilfe der Navigation API) und den Seiteninhalt mithilfe von clientseitigem Code aktualisiert. Daher ist diese Technik nicht für SPAs geeignet.

js
// Create and show notification
if (self.Notification.permission === "granted") {
  const notificationObject = {
    body: "Click here to view your messages.",
    data: { url: `${self.location.origin}/some/path` },
  };
  self.registration.showNotification(
    "You've got messages!",
    notificationObject,
  );
}

// Handle notification click
self.addEventListener("notificationclick", (e) => {
  // Close the notification popout
  e.notification.close();
  e.waitUntil(
    // Get all the Window clients
    clients.matchAll({ type: "window" }).then((clientsArr) => {
      const windowToFocus = clientsArr.find(
        (windowClient) => windowClient.url === e.notification.data.url,
      );
      if (windowToFocus) {
        // If a Window tab matching the targeted URL already exists, focus that;
        windowToFocus.focus();
      } else {
        // Otherwise, open a new tab to the applicable URL and focus it.
        clients
          .openWindow(e.notification.data.url)
          .then((windowClient) => (windowClient ? windowClient.focus() : null));
      }
    }),
  );
});

Spezifikationen

Spezifikation
Service Workers Nightly
# clients-openwindow

Browser-Kompatibilität