MediaDevices: devicechange-Ereignis
Eingeschränkt verfügbar
Diese Funktion ist nicht Baseline, da sie in einigen der am weitesten verbreiteten Browser nicht funktioniert.
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 wird oder entfernt wird.
Dieses Ereignis kann nicht abgebrochen werden und es propagiert nicht.
Syntax
Verwenden Sie den Ereignisnamen in Methoden wie addEventListener() oder setzen Sie eine Ereignishandler-Eigenschaft.
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. Sie zeigt im Browserfenster zwei Listen an: eine für Audiogeräte und eine für Videogeräte, mit sowohl dem Gerätenamen (Label) als auch 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 jedes Mal aktualisiert, wenn ein Mediengerät an das Gerät angeschlossen oder von diesem entfernt wird.
Wir richten globale Variablen ein, die Referenzen zu den <ul>-Elementen enthalten, die zur Auflistung der Audio- und Videogeräte verwendet werden:
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 und dann die angezeigten Listen der Audio- und Videogeräte mit diesen Informationen aktualisieren möchten.
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 das Promise, das von enumerateDevices() zurückgegeben wird, erfüllt wird. Der Erfüllungs-Handler wird aufgerufen, wenn die Geräteliste bereit ist. Die Liste wird dem Erfüllungs-Handler als Array von MediaDeviceInfo-Objekten übergeben, die jeweils ein Medien-Eingabe- oder -Ausgabegerät beschreiben.
Eine forEach()-Schleife wird verwendet, um alle Geräte zu durchsuchen. Für jedes Gerät erstellen wir ein neues <li>-Objekt, das zur Anzeige für den Benutzer verwendet wird.
Die Zeile let [kind, type, direction] = device.kind.match(/(\w+)(input|output)/i); verdient besondere Beachtung. Diese verwendet Destructuring-Zuweisung, 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, in der die Medien fließen, enthält, wie z.B. "audioinput" oder "videooutput". Diese Zeile extrahiert also den Typ ("audio" oder "video") und die Richtung ("input" oder "output"), damit sie zur Erstellung des im Verzeichnis angezeigten Strings verwendet werden können.
Sobald der String zusammengesetzt ist, der den Gerätenamen fett und die Richtung in Klammern enthält, wird er durch Aufrufen von appendChild() entweder an audioList oder videoList angehängt, je nach Gerätetyp.
Umgang mit Änderungen der Geräteliste
Wir rufen updateDeviceList() an zwei Stellen auf. Die erste ist im Erfüllungs-Handler des getUserMedia()-Promises, um die Liste zu füllen, wenn der Stream geöffnet wird. Die zweite ist im Ereignishandler für dieses devicechange-Ereignis:
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 eines ein- oder ausschaltet, updateDeviceList() aufgerufen, um die Liste der verbundenen Geräte neu zu zeichnen.
Ergebnis
Spezifikationen
| Spezifikation |
|---|
| Media Capture and Streams> # event-mediadevices-devicechange> |
| Media Capture and Streams> # dom-mediadevices-ondevicechange> |