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, sobald ein Mediengerät wie eine Kamera, ein Mikrofon oder ein Lautsprecher mit dem System verbunden oder vom System getrennt wird.
Dieses Ereignis ist nicht abbrechbar und löst keine Bubbling-Effekte aus.
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 wird dann immer aufgerufen, wenn sich die Geräteliste ändert. Sie zeigt im Browserfenster zwei Listen an: eine mit Audiogeräten und eine mit Videogeräten, jeweils mit dem Gerätenamen (Label) und der Angabe, ob es sich um ein Eingangs- oder Ausgangsgerät handelt. Da das Beispiel einen Handler für das devicechange
-Ereignis bereitstellt, wird die Liste aktualisiert, sobald ein Mediengerät an das Gerät angeschlossen wird oder davon entfernt wird, auf dem das Beispiel läuft.
Wir richten globale Variablen ein, die Referenzen zu den <ul>
-Elementen enthalten, die verwendet werden, um die Audio- und Videogeräte aufzulisten:
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 wollen und dann die angezeigten Listen der Audio- und Videogeräte mit diesen Informationen aktualisieren wollen.
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 ist, 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 in den Fulfillment-Handler als ein Array von MediaDeviceInfo
-Objekten übergeben, die jeweils ein Ein- 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 verwendet wird, um es dem Benutzer anzuzeigen.
Die Zeile let [kind, type, direction] = device.kind.match(/(\w+)(input|output)/i);
verdient besondere Beachtung. Dies nutzt Destructuring Assignment, um die Werte der ersten drei Einträge im Array, das von String.match()
zurückgegeben wird, den Variablen kind
, type
und direction
zuzuweisen. Dies machen wir, weil der Wert von MediaDeviceInfo.kind
ein einzelner String ist, der sowohl den Medientyp als auch die Richtung enthält, in die die Medien fließen, wie "audioinput" oder "videooutput". Diese Zeile extrahiert dann den Typ ("audio" oder "video") und die Richtung ("input" oder "output"), sodass sie verwendet werden können, um die in der Liste angezeigte Zeichenfolge zu erstellen.
Sobald die Zeichenfolge erstellt ist, die den Gerätenamen in Fettdruck und die Richtung in Klammern enthält, wird sie durch Aufrufen von appendChild()
der passenden Liste (audioList
oder videoList
, je nach Gerätetyp) hinzugefügt.
Umgang mit Änderungen der Geräteliste
Wir nennen updateDeviceList()
an zwei Stellen. Die erste befindet sich im Fulfillment-Handler des getUserMedia()
-Promises, um die Liste initial zu füllen, wenn der Stream geöffnet wird. Der 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
Specification |
---|
Media Capture and Streams # event-mediadevices-devicechange |
Media Capture and Streams # dom-mediadevices-ondevicechange |