Signatur
Beschreibung
Ein PermissionStatus-Objekt bekommst du nie über einen Konstruktor. Du erhältst es als aufgelösten Wert von navigator.permissions.query({ name }). Es gibt an, ob eine Berechtigung für die aktuelle Herkunft (Origin) bereits erteilt ("granted") oder verweigert ("denied") wurde. Der dritte Zustand "prompt" bedeutet, dass der Browser beim nächsten Zugriff nachfragen würde.
Wichtige Mitglieder:
state(nur lesbar):"granted","denied"oder"prompt".name(nur lesbar): der Name der abgefragten Berechtigung, z. B."geolocation".onchangebzw.addEventListener("change", …): wird ausgelöst, sobald sichstateändert, etwa wenn die Person die Berechtigung in den Seiteneinstellungen widerruft.- Veraltet:
statuswar der frühere Name vonstateund sollte nicht mehr verwendet werden.
Typischerweise prüfst du den Status, bevor du eine Funktion aufrufst, die einen Berechtigungsdialog auslöst. So kannst du die Oberfläche anpassen: bei "denied" einen Hinweis anzeigen, bei "prompt" einen erklärenden Button, bei "granted" direkt loslegen. Über das change-Ereignis bleibt die Oberfläche auch dann aktuell, wenn die Berechtigung später außerhalb der Seite geändert wird.
Rückgabewert
navigator.permissions.query() geliefert. Es ist ein EventTarget mit den Eigenschaften state, name und onchange.Beispiele
Status abfragen (Instanz über query erhalten)
const checkGeo = async () => {
// PermissionStatus-Instanz über die Permissions API erhalten
const status = await navigator.permissions.query({ name: 'geolocation' });
console.log(`${status.name}: ${status.state}`);
return status;
};
checkGeo();
UI abhängig vom Status steuern
const locateBtn = document.querySelector('#locate');
const hint = document.querySelector('#hint');
const render = (state) => {
locateBtn.hidden = state === 'denied';
hint.textContent = {
granted: 'Standort wird verwendet.',
prompt: 'Klicke auf den Button, um deinen Standort freizugeben.',
denied: 'Standortzugriff blockiert – bitte in den Browser-Einstellungen ändern.'
}[state];
};
const init = async () => {
const status = await navigator.permissions.query({ name: 'geolocation' });
render(status.state);
// Auf spätere Änderungen reagieren (z. B. Widerruf in den Seiteneinstellungen)
status.addEventListener('change', () => render(status.state));
};
init();
change-Ereignis per onchange und wieder entfernen
const watchNotifications = async () => {
const status = await navigator.permissions.query({ name: 'notifications' });
status.onchange = () => {
console.log('Benachrichtigungen jetzt:', status.state);
};
// Später Überwachung beenden
return () => { status.onchange = null; };
};
const stop = await watchNotifications();
// ... irgendwann:
stop();
Robuste Abfrage mit Fallback
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 Berechtigungsname im Browser unbekannt ist
return 'unsupported';
}
};
console.log(await getPermissionState('camera'));
// Wichtig · Fallstricke
- Nur abfragen, nicht anfordern:
PermissionStatuslöst keinen Dialog aus. Um eine Berechtigung anzufordern, rufst du die eigentliche API auf, z. B.getCurrentPosition()oderNotification.requestPermission(). - Unterstützte Namen sind je nach Browser verschieden:
"camera","microphone","clipboard-read","midi"u. a. werden nicht überall unterstützt. Unbekannte Namen führen zu einem abgelehnten Promise mitTypeError. Deshalb immertry/catchverwenden. - Sicherer Kontext: Die Permissions API gibt es nur unter HTTPS bzw.
localhost. In Web Workern wird sie nur teilweise unterstützt. - Safari: Volle Unterstützung erst ab Version 16. Ältere Versionen haben kein
navigator.permissions. - Datenschutz: Manche Browser melden bei
"denied"aus Schutz vor Fingerprinting weiterhin"prompt", oder sie setzen die Berechtigung nach einer Weile automatisch zurück. Verlass dich deshalb nie allein aufstate, sondern behandle Fehler auch beim eigentlichen API-Aufruf. - Die veraltete Eigenschaft
statussolltest du nicht mehr nutzen. Verwende stattdessenstate.