MediaDevices: devicechange Ereignis

Sicherer Kontext: Diese Funktion ist nur in sicheren Kontexten (HTTPS) in einigen oder allen unterstützenden Browsern verfügbar.

Das devicechange Ereignis wird an eine MediaDevices Instanz gesendet, wenn ein Mediengerät wie eine Kamera, ein Mikrofon oder ein Lautsprecher mit dem System verbunden oder davon entfernt wird.

Dieses Ereignis ist nicht abbruchsicher und wird nicht weitergeleitet.

Syntax

Verwenden Sie den Ereignisnamen in Methoden wie addEventListener() oder setzen Sie eine Ereignis-Handler-Eigenschaft.

js
addEventListener("devicechange", (event) => {});

ondevicechange = (event) => {};

Ereignistyp

Ein generisches Event.

Beispiel

In diesem Beispiel erstellen wir eine Funktion namens updateDeviceList(), die einmal aufgerufen wird, wenn MediaDevices.getUserMedia() erfolgreich einen Stream erhält, und dann jedes Mal aufgerufen wird, wenn sich die Geräteliste ändert. Es werden im Browserfenster zwei Listen angezeigt: eine für Audiogeräte und eine für Videogeräte, jeweils mit dem Gerätenamen (Label) und der Angabe, ob es sich um ein Eingabe- oder Ausgabegerät handelt. Da das Beispiel einen Handler für das devicechange Ereignis bereitstellt, wird die Liste jedes Mal aktualisiert, wenn ein Mediengerät an das Gerät angeschlossen oder davon entfernt wird, auf dem das Beispiel läuft.

Wir richten globale Variablen ein, die Referenzen zu den <ul> Elementen enthalten, die zur Auflistung der Audio- und Videogeräte verwendet werden:

js
const audioList = document.getElementById("audioList");
const videoList = document.getElementById("videoList");

Abrufen und Zeichnen der Geräteliste

Sehen wir uns nun updateDeviceList() selbst an. Diese Methode wird jedes Mal aufgerufen, wenn wir die aktuelle Liste der Mediengeräte abrufen und dann die angezeigten Listen der Audio- und Videogeräte mit diesen Informationen aktualisieren möchten.

js
function updateDeviceList() {
  navigator.mediaDevices.enumerateDevices().then((devices) => {
    audioList.textContent = "";
    videoList.textContent = "";

    devices.forEach((device) => {
      const elem = document.createElement("li");
      const [kind, type, direction] = device.kind.match(/(\w+)(input|output)/i);

      elem.innerHTML = `<strong>${device.label}</strong> (${direction})`;
      if (type === "audio") {
        audioList.appendChild(elem);
      } else if (type === "video") {
        videoList.appendChild(elem);
      }
    });
  });
}

updateDeviceList() besteht vollständig aus einem Aufruf der Funktion enumerateDevices() auf dem MediaDevices Objekt, das in der navigator.mediaDevices Eigenschaft referenziert wird, sowie dem Code, der ausgeführt wird, wenn der promise zurückgegeben von enumerateDevices() erfüllt wird. Der Erfüllungs-Handler wird aufgerufen, wenn die Geräteliste bereit ist. Die Liste wird als Array von MediaDeviceInfo Objekten in den Erfüllungs-Handler übergeben, wobei jedes eine Medien-Ein- oder -Ausgabegerät beschreibt.

Eine forEach() Schleife wird verwendet, um alle Geräte zu durchsuchen. Für jedes Gerät erstellen wir ein neues <li> Objekt, das dem Benutzer angezeigt wird.

Die Zeile let [kind, type, direction] = device.kind.match(/(\w+)(input|output)/i); verdient besondere Beachtung. Diese nutzt Destructuring Assignment, um die Werte der ersten drei Elemente des Arrays, das von String.match() zurückgegeben wird, den Variablen kind, type und direction zuzuweisen. Wir machen dies, weil der Wert von MediaDeviceInfo.kind ein einzelner String ist, der sowohl den Medientyp als auch die Richtung, in die die Medien fließen, umfasst, wie beispielsweise "audioinput" oder "videooutput". Diese Zeile zieht dann den Typ ("audio" oder "video") und die Richtung ("input" oder "output") heraus, um die Zeichenkette zu konstruieren, die in der Liste angezeigt wird.

Sobald die Zeichenkette zusammengefügt ist, die den Gerätenamen in Fettschrift und die Richtung in Klammern enthält, wird sie durch Aufruf von appendChild() zur entsprechenden Liste hinzugefügt, entweder audioList oder videoList, je nach Gerätetyp.

Umgang mit Änderungen der Geräteliste

Wir rufen updateDeviceList() an zwei Stellen auf. Die erste ist im getUserMedia() Promise-Erfüllungs-Handler, um die Liste beim Öffnen des Streams initial auszufüllen. Die zweite ist im Ereignis-Handler für dieses devicechange Ereignis:

js
navigator.mediaDevices.ondevicechange = (event) => {
  updateDeviceList();
};

Mit diesem Code wird jedes Mal, wenn der Benutzer eine Kamera, ein Mikrofon oder ein anderes Mediengerät anschließt oder ein- oder ausschaltet, updateDeviceList() aufgerufen, um die Liste der angeschlossenen Geräte neu zu zeichnen.

Ergebnis

Spezifikationen

Specification
Media Capture and Streams
# event-mediadevices-devicechange
Media Capture and Streams
# dom-mediadevices-ondevicechange

Browser-Kompatibilität

BCD tables only load in the browser