Start · Sprachen · JavaScript · Referenz · Sensor: activate

Sensor: activate

Ereignis

Wird ausgelöst, sobald ein <code>Sensor</code> nach <code>start()</code> aktiv ist und Messwerte liefern kann.

seit JavaScript Generic Sensor API — Chromium-Browser (Chrome/Edge Kategorie: webapi

Signatur

sensor.addEventListener("activate", handler)

Beschreibung

Das activate-Ereignis gehört zur Generic Sensor API und wird an einem Sensor-Objekt (z. B. Accelerometer, Gyroscope, AmbientLightSensor, AbsoluteOrientationSensor) ausgelöst, wenn der Sensor nach dem Aufruf von start() tatsächlich bereit ist. Ab diesem Zeitpunkt ist sensor.activated true. Der erste Messwert kommt kurz danach über das reading-Ereignis.

Anmelden können Sie sich mit sensor.addEventListener("activate", handler) oder über die Eigenschaft sensor.onactivate = handler. Der Handler bekommt ein einfaches Event ohne zusätzliche Eigenschaften. Er eignet sich dafür, die Oberfläche umzuschalten (etwa „Sensor läuft“ anzeigen), Zeitmessungen zu starten oder Ladeanzeigen auszublenden.

Das Ereignis wird nur ausgelöst, wenn die Aktivierung klappt. Wenn Berechtigungen fehlen, der Sensor nicht vorhanden ist oder das Dokument nicht sichtbar ist, kommt stattdessen ein error-Ereignis (SensorErrorEvent). Deshalb sollten Sie activate immer zusammen mit error behandeln.

Parameter

Name Typ Default Beschreibung
$type Pflicht string Der Ereignistyp, hier "activate".
$handler Pflicht (event: Event) => void Callback, das bei der Aktivierung aufgerufen wird. event.target ist die Sensor-Instanz.
$options boolean | AddEventListenerOptions false Optionale Listener-Optionen wie { once: true } oder { signal }.

Rückgabewert

Typ
void
Beschreibung
addEventListener gibt nichts zurück. Der Handler bekommt ein Event ohne eigene Zusatzdaten.

Beispiele

Beschleunigungssensor starten und Aktivierung erkennen

if ('Accelerometer' in window) {
  const sensor = new Accelerometer({ frequency: 30 });

  sensor.addEventListener('activate', () => {
    console.log('Sensor aktiv:', sensor.activated);
  });

  sensor.addEventListener('reading', () => {
    console.log(`x=${sensor.x.toFixed(2)} y=${sensor.y.toFixed(2)} z=${sensor.z.toFixed(2)}`);
  });

  sensor.addEventListener('error', (e) => {
    console.error('Sensorfehler:', e.error.name, e.error.message);
  });

  sensor.start();
} else {
  console.warn('Accelerometer wird nicht unterstützt.');
}
Sensor aktiv: true x=0.12 y=9.78 z=0.35 ...

onactivate-Eigenschaft mit Statusanzeige in der Oberfläche

const status = document.querySelector('#sensor-status');
const gyro = new Gyroscope({ frequency: 60 });

status.textContent = 'Starte Gyroskop …';

gyro.onactivate = () => {
  status.textContent = 'Gyroskop läuft';
  status.classList.add('aktiv');
};

gyro.onerror = (e) => {
  status.textContent = `Fehler: ${e.error.name}`;
};

gyro.start();

// Später Handler entfernen
// gyro.onactivate = null;

Aktivierung als Promise mit Berechtigungsprüfung und Timeout

const activateSensor = (sensor, timeoutMs = 3000) =>
  new Promise((resolve, reject) => {
    const controller = new AbortController();
    const { signal } = controller;
    const timer = setTimeout(() => {
      controller.abort();
      reject(new Error('Zeitüberschreitung bei der Sensor-Aktivierung'));
    }, timeoutMs);

    sensor.addEventListener('activate', () => {
      clearTimeout(timer);
      controller.abort(); // entfernt beide Listener
      resolve(sensor);
    }, { signal });

    sensor.addEventListener('error', (e) => {
      clearTimeout(timer);
      controller.abort();
      reject(e.error);
    }, { signal });

    sensor.start();
  });

const main = async () => {
  const perm = await navigator.permissions.query({ name: 'ambient-light-sensor' });
  if (perm.state === 'denied') {
    console.warn('Zugriff auf Lichtsensor verweigert.');
    return;
  }
  const light = await activateSensor(new AmbientLightSensor());
  console.log('Lichtsensor bereit, aktiviert =', light.activated);
  light.onreading = () => console.log(`${light.illuminance} lx`);
};

main().catch((err) => console.error(err.name, err.message));
Lichtsensor bereit, aktiviert = true 312 lx

// Wichtig · Fallstricke

  • Browser-Unterstützung: Die Generic Sensor API gibt es nur in Chromium-Browsern (Chrome, Edge, Opera, Samsung Internet). Firefox und Safari unterstützen sie nicht. Prüfen Sie die Unterstützung immer vorher, z. B. mit 'Accelerometer' in window.
  • Sicherer Kontext nötig: Die Sensoren funktionieren nur über HTTPS (oder localhost). In iframes muss die Permissions Policy sie freigeben (z. B. allow="accelerometer; gyroscope").
  • Kein activate im Fehlerfall: Wenn eine Berechtigung fehlt (NotAllowedError), der Sensor nicht vorhanden ist (NotReadableError) oder die Funktion nicht unterstützt wird, kommt nur error. Ohne error-Handler wartet Ihre Anwendung sonst endlos.
  • Konstruktor kann werfen: new Accelerometer() kann schon beim Erzeugen einen SecurityError oder ReferenceError auslösen. Setzen Sie ihn deshalb in try/catch.
  • Sichtbarkeit: Wird das Dokument unsichtbar (Tab im Hintergrund), werden die Sensoren angehalten. Ein erneutes activate nach dem Zurückkehren ist nicht garantiert. Prüfen Sie im Zweifel sensor.activated.
  • Timing: Wenn Sie den Listener erst nach start() anmelden, kann das Ereignis in seltenen Fällen schon vorbei sein. Melden Sie Listener deshalb immer vor start() an.
  • Akku: Aktive Sensoren verbrauchen Strom. Rufen Sie sensor.stop() auf, sobald Sie keine Messwerte mehr brauchen.