Start · Sprachen · JavaScript · Referenz · Navigator.permissions

Navigator.permissions

Eigenschaft

Schreibgeschützte Eigenschaft, die ein <code>Permissions</code>-Objekt liefert, mit dem sich der Berechtigungsstatus von Web-APIs abfragen lässt.

seit JavaScript Baseline 2022: alle modernen Browser (Chrome 43+, Kategorie: webapi

Signatur

Navigator.permissions

Beschreibung

navigator.permissions gibt ein Permissions-Objekt zurück. Es gehört zur Permissions API und bietet eine einheitliche Schnittstelle, über die du den aktuellen Berechtigungsstatus einer API abfragen kannst, zum Beispiel für Geolokalisierung, Benachrichtigungen, Kamera, Mikrofon oder Zwischenablage. Dabei wird der Nutzer nicht mit einem Berechtigungsdialog unterbrochen.

Die wichtigste Methode ist permissions.query({ name }). Sie gibt ein Promise<PermissionStatus> zurück. Dessen Eigenschaft state hat einen der Werte "granted", "denied" oder "prompt". Über das change-Ereignis des PermissionStatus erfährst du außerdem, wenn der Nutzer die Berechtigung später in den Browser-Einstellungen ändert.

Typischer Einsatz: Bevor du eine Berechtigung anforderst, prüfst du den Status und passt die Oberfläche an. Ist der Status "denied", zeigst du einen Hinweis statt eines Buttons, der ohnehin nichts bewirkt. Ist er "prompt", erklärst du vorher, wozu du die Berechtigung brauchst. Die eigentliche Anfrage läuft weiterhin über die jeweilige API, etwa Notification.requestPermission() oder navigator.geolocation.getCurrentPosition().

Die Eigenschaft gibt es auch in Web Workern als WorkerNavigator.permissions. Sie steht nur in sicheren Kontexten (HTTPS) zur Verfügung.

Rückgabewert

Typ
Permissions
Beschreibung
Ein Permissions-Objekt mit der Methode query(). Die Methoden request() und revoke() sind veraltet bzw. experimentell und sollten nicht verwendet werden.

Beispiele

Status der Geolokalisierung abfragen

const checkGeo = async () => {
  const status = await navigator.permissions.query({ name: 'geolocation' });
  console.log(`Geolokalisierung: ${status.state}`);
  return status.state;
};

checkGeo();
Geolokalisierung: prompt

Oberfläche passend zum Benachrichtigungs-Status anzeigen

const button = document.querySelector('#notify-btn');
const hint = document.querySelector('#notify-hint');

const updateUI = (state) => {
  button.hidden = state !== 'prompt';
  hint.textContent = state === 'denied'
    ? 'Benachrichtigungen sind blockiert. Bitte in den Browser-Einstellungen freigeben.'
    : state === 'granted' ? 'Benachrichtigungen sind aktiv.' : '';
};

const init = async () => {
  const status = await navigator.permissions.query({ name: 'notifications' });
  updateUI(status.state);

  // Auf spätere Änderungen durch den Nutzer reagieren
  status.addEventListener('change', () => updateUI(status.state));
};

button.addEventListener('click', () => Notification.requestPermission());
init();

Robuste Abfrage mit Feature-Erkennung und Fehlerbehandlung

const getPermissionState = async (name) => {
  if (!('permissions' in navigator)) return 'unsupported';
  try {
    const { state } = await navigator.permissions.query({ name });
    return state;
  } catch (err) {
    // TypeError, wenn der Browser den Namen nicht kennt
    console.warn(`Berechtigung "${name}" nicht abfragbar:`, err.message);
    return 'unsupported';
  }
};

const names = ['camera', 'microphone', 'clipboard-read', 'geolocation'];
const results = await Promise.all(names.map(getPermissionState));
console.table(Object.fromEntries(names.map((n, i) => [n, results[i]])));
{ camera: 'prompt', microphone: 'prompt', clipboard-read: 'unsupported', geolocation: 'granted' } (browserabhängig)

// Wichtig · Fallstricke

  • Unterschiedlich unterstützte Namen: Welche Namen query() akzeptiert, ist je nach Browser verschieden. Firefox und Safari lehnen zum Beispiel "clipboard-read", "clipboard-write" oder teils "camera" und "microphone" mit einem TypeError ab. Setze query() deshalb immer in try/catch.
  • Nur sichere Kontexte: Auf HTTP-Seiten ist navigator.permissions nicht vorhanden. Prüfe mit 'permissions' in navigator.
  • Der Status ist nicht verbindlich: "granted" bedeutet nicht, dass der API-Aufruf garantiert klappt. Hardware kann fehlen, und Richtlinien wie die Permissions-Policy in iframes können den Zugriff trotzdem sperren. Behandle Fehler deshalb immer auch in der eigentlichen API.
  • Keine Anfrage beim Nutzer: query() zeigt nie einen Berechtigungsdialog an. Nutze zum Anfordern die jeweilige API. Permissions.request() und revoke() sind nicht standardisiert bzw. entfernt.
  • Datenschutz: Manche Browser melden "prompt", obwohl der Status in Wirklichkeit "denied" ist. So erschweren sie Fingerprinting.