[go: up one dir, main page]

Dieser Inhalt wurde automatisch aus dem Englischen übersetzt, und kann Fehler enthalten. Erfahre mehr über dieses Experiment.

View in English Always switch to English

MediaDevices: devicechange Ereignis

Limited availability

This feature is not Baseline because it does not work in some of the most widely-used browsers.

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, wann immer ein Mediengerät wie eine Kamera, ein Mikrofon oder ein Lautsprecher mit dem System verbunden oder vom System entfernt wird.

Dieses Ereignis kann nicht abgebrochen werden und wird nicht propagiert.

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, wenn sich die Geräteliste ändert. Es zeigt im Browserfenster zwei Listen an: eine von Audiogeräten und eine von Videogeräten, jeweils mit dem Gerätenamen (Label) und der Information, ob es sich um ein Ein- oder Ausgabegerät handelt. Da das Beispiel einen Handler für das devicechange Ereignis bereitstellt, wird die Liste aktualisiert, wann immer ein Mediengerät an das Gerät angeschlossen oder davon entfernt wird, auf dem das Beispiel ausgeführt wird.

Wir richten globale Variablen ein, die Referenzen auf die <ul> Elemente enthalten, die verwendet werden, um die Audio- und Videogeräte aufzulisten:

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

Abrufen und Zeichnen der Geräteliste

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

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 ausschließlich 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 das promise, das von enumerateDevices() zurückgegeben wird, erfüllt wird. Der Fulfillment-Handler wird aufgerufen, wenn die Geräteliste bereit ist. Die Liste wird dem Fulfillment-Handler als Array von MediaDeviceInfo Objekten übergeben, von denen jedes ein Medien-Ein- oder Ausgabegerät beschreibt.

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

Der Code let [kind, type, direction] = device.kind.match(/(\w+)(input|output)/i); verdient besondere Beachtung. Dieser verwendet Destrukturierung, um die Werte der ersten drei Elemente des Arrays, das von String.match() zurückgegeben wird, den Variablen kind, type, und direction zuzuweisen. Wir tun dies, weil der Wert von MediaDeviceInfo.kind ein einzelner String ist, der sowohl den Medientyp als auch die Richtung des Medienflusses umfasst, wie "audioinput" oder "videooutput". Diese Zeile extrahiert also den Typ ("audio" oder "video") und die Richtung ("input" oder "output"), damit sie zum Erstellen des in der Liste angezeigten Strings verwendet werden können.

Sobald der String, der den Gerätenamen in Fettdruck und die Richtung in Klammern enthält, zusammengebaut ist, wird er durch einen Aufruf von appendChild() an audioList oder videoList angehängt, abhängig vom Gerätetyp.

Umgang mit Änderungen in der Geräteliste

Wir rufen updateDeviceList() an zwei Stellen auf. Die erste ist im Fulfillment-Handler von getUserMedia(), um die Liste initial zu füllen, wenn der Stream geöffnet wird. Die zweite ist im Ereignishandler 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 solches ein- oder ausschaltet, updateDeviceList() aufgerufen, um die Liste der verbundenen 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