Signatur
Beschreibung
Das error-Ereignis gehört zur Generic Sensor API. Es wird an allen abgeleiteten Sensor-Klassen ausgelöst, etwa Accelerometer, Gyroscope, Magnetometer, AbsoluteOrientationSensor, RelativeOrientationSensor, AmbientLightSensor oder GravitySensor. Das passiert in zwei Fällen: wenn nach sensor.start() keine Messwerte geliefert werden können oder wenn ein laufender Sensor ausfällt.
Der Handler bekommt ein SensorErrorEvent. Dessen Eigenschaft error enthält eine DOMException, und über error.name lässt sich die Ursache unterscheiden:
NotAllowedError– der Nutzer oder der Browser hat die nötige Berechtigung verweigert (Permissions API, z. B."accelerometer").NotReadableError– der Sensor ist nicht erreichbar, zum Beispiel weil das Gerät keine passende Hardware hat oder sie gerade anderweitig belegt ist.NotSupportedError– der Sensortyp oder die gewünschten Optionen werden vom Gerät nicht unterstützt.
Sie können den Handler mit addEventListener("error", handler) registrieren oder über die Eigenschaft sensor.onerror = handler. Nach einem Fehler geht der Sensor in den Zustand „idle“ über: sensor.activated ist dann false, und reading-Ereignisse kommen nicht mehr an. Behandeln Sie das Ereignis deshalb immer. Nur so kann Ihre Anwendung sauber auf eine Alternative umschalten, etwa auf DeviceMotionEvent, oder dem Nutzer einen Hinweis zeigen.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $type Pflicht | string | Der Ereignisname, hier immer "error". |
|
| $listener Pflicht | (event: SensorErrorEvent) => void | Callback-Funktion, die ein SensorErrorEvent bekommt. Die Ursache steht in event.error (eine DOMException). |
|
| $options | boolean | AddEventListenerOptions | false | Optionale Einstellungen wie once, signal oder capture. |
Rückgabewert
addEventListener gibt nichts zurück. Der Handler bekommt ein SensorErrorEvent mit der Eigenschaft error: DOMException.Beispiele
Fehler beim Beschleunigungssensor mit addEventListener auswerten
if ('Accelerometer' in window) {
const sensor = new Accelerometer({ frequency: 30 });
sensor.addEventListener('reading', () => {
console.log(`x=${sensor.x?.toFixed(2)} y=${sensor.y?.toFixed(2)} z=${sensor.z?.toFixed(2)}`);
});
sensor.addEventListener('error', (event) => {
const { name, message } = event.error;
if (name === 'NotAllowedError') {
console.warn('Zugriff auf den Sensor wurde verweigert.');
} else if (name === 'NotReadableError') {
console.warn('Sensor ist nicht verfügbar.');
} else {
console.error(`Sensorfehler (${name}): ${message}`);
}
});
sensor.start();
} else {
console.log('Accelerometer wird nicht unterstützt.');
}
Handler über die onerror-Eigenschaft setzen
const light = new AmbientLightSensor();
light.onreading = () => {
document.body.classList.toggle('dark', light.illuminance < 50);
};
light.onerror = (event) => {
console.log('Lichtsensor-Fehler:', event.error.name);
// Handler wieder entfernen
light.onerror = null;
};
light.start();
Robuster Start mit Berechtigungsprüfung, Ausweichlösung und removeEventListener
const startGyroscope = async () => {
let sensor;
try {
const { state } = await navigator.permissions.query({ name: 'gyroscope' });
if (state === 'denied') throw new Error('Berechtigung verweigert');
// Kann synchron einen SecurityError werfen (Permissions-Policy)
sensor = new Gyroscope({ frequency: 60 });
} catch (err) {
console.warn('Gyroscope nicht nutzbar, nutze devicemotion:', err.message);
window.addEventListener('devicemotion', (e) => console.log(e.rotationRate));
return;
}
const onError = (event) => {
console.error('Gyroscope-Fehler:', event.error.name);
sensor.stop();
sensor.removeEventListener('error', onError);
};
sensor.addEventListener('error', onError);
sensor.addEventListener('reading', () => console.log(sensor.x, sensor.y, sensor.z));
sensor.start();
};
startGyroscope();
// Wichtig · Fallstricke
- Nicht alle Fehler kommen als Ereignis an: Blockiert eine Permissions-Policy (
allow="accelerometer"usw.) den Zugriff, wirft schon der Konstruktor synchron einenSecurityError. Ist die Klasse gar nicht vorhanden, gibt es einenReferenceError. Umschließen Sienew XyzSensor()deshalb mittry…catch. - Sicherer Kontext nötig: Die Generic Sensor API steht nur über HTTPS (oder
localhost) zur Verfügung. In Cross-Origin-iframes muss die passende Permissions-Policy gesetzt sein. - Browser-Unterstützung: Nur Chromium-basierte Browser unterstützen die API, also Chrome, Edge und Opera, vor allem auf Mobilgeräten. Firefox und Safari unterstützen sie nicht.
AmbientLightSensorist außerdem nur hinter einem Flag verfügbar. Prüfen Sie immer vorher per Feature-Erkennung ('Accelerometer' in window) und sehen Sie eine Ausweichlösung vor, etwaDeviceMotionEventoderDeviceOrientationEvent. - Nach einem Fehler ist der Sensor inaktiv (
activated === false). Einen erneuten Versuch starten Sie mitsensor.start(), zum Beispiel nachdem der Nutzer die Berechtigung erteilt hat. - Das Ereignis steigt nicht im DOM auf (kein Bubbling), weil
Sensorkein DOM-Knoten ist. Registrieren Sie den Handler deshalb direkt an der Sensor-Instanz.