MediaDevices: событие devicechange
Безопасный контекст: Эта функция доступна только в безопасных контекстах (HTTPS) в некоторых или всех поддерживающих браузерах.
Событие devicechange отправляется экземпляру MediaDevices всякий раз, когда медиаустройство, такое как камера, микрофон или динамик, подключается или отключается от системы.
Это событие не отменяется и не распространяется.
Синтаксис
Используйте имя события в методах, таких как addEventListener(), или задайте свойство обработчика событий.
addEventListener("devicechange", (event) => {});
ondevicechange = (event) => {};
Тип события
Общее Event.
Пример
В этом примере мы создаём функцию updateDeviceList(), которая вызывается один раз, когда MediaDevices.getUserMedia() успешно получает поток, а затем вызывается каждый раз, когда список устройств изменяется. Она отображает в окне браузера два списка: один для аудиоустройств и один для видеоустройств, с меткой устройства (названием) и указанием, является ли это устройство устройством ввода или вывода. Так как пример предоставляет обработчик события devicechange, список обновляется каждый раз, когда к устройству, на котором запущен образец, подключается или отключается медиаустройство.
Мы настраиваем глобальные переменные, которые содержат ссылки на элементы <ul>, используемые для перечисления аудио- и видеоустройств:
const audioList = document.getElementById("audioList");
const videoList = document.getElementById("videoList");
Получение и отрисовка списка устройств
Теперь давайте посмотрим на updateDeviceList(). Этот метод вызывается всякий раз, когда нам нужно получить текущий список медиаустройств и обновить отображаемые списки аудио- и видеоустройств, используя эту информацию.
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() состоит целиком из вызова функции enumerateDevices() объекта MediaDevices, на который ссылается свойство navigator.mediaDevices, а также кода, выполняемого, когда promise, возвращаемый enumerateDevices(), выполняется. Обработчик выполнения вызывается, когда список устройств готов. Список передаётся в обработчик выполнения в виде массива объектов MediaDeviceInfo, каждый из которых описывает одно медиаустройство ввода или вывода.
Цикл forEach() используется для просмотра всех устройств. Для каждого устройства мы создаём новый объект <li>, используемый для отображения его пользователю.
Строка let [kind, type, direction] = device.kind.match(/(\w+)(input|output)/i); заслуживает особого внимания. Она использует деструктурирующее присваивание для присвоения значений первых трёх элементов массива, возвращаемого String.match(), переменным kind, type и direction. Мы делаем это, потому что значение MediaDeviceInfo.kind представляет собой одну строку, содержащую тип медиа и направление потока медиа, например, "audioinput" или "videooutput". Эта строка затем извлекает тип ("audio" или "video") и направление ("вход" или "выход"), чтобы их можно было использовать для построения строки, отображаемой в списке.
После сборки строки, содержащей имя устройства в жирном шрифте и направление в скобках, она добавляется в соответствующий список путём вызова appendChild() для audioList или videoList, в зависимости от типа устройства.
Обработка изменений списка устройств
Мы вызываем updateDeviceList() в двух местах. Первое — в обработчике выполнения обещания getUserMedia() для первоначального заполнения списка при открытии потока. Второе — в обработчике событий для этого события devicechange:
navigator.mediaDevices.ondevicechange = (event) => {
updateDeviceList();
};
С этим кодом каждый раз, когда пользователь подключает камеру, микрофон или другое медиаустройство, или включает или выключает его, мы вызываем updateDeviceList() для перерисовки списка подключенных устройств.
Результат
Спецификации
| Спецификация |
|---|
| Media Capture and Streams # event-mediadevices-devicechange |
| Media Capture and Streams # dom-mediadevices-ondevicechange |
Совместимость с браузерами
| Рабочий стол | Мобильные устройства | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|
| Chrome | Edge | Firefox | Opera | Safari | Chrome Android | Firefox для Android | Opera Android | Safari на iOS | Samsung Internet | WebView Android | |
devicechange_event |
57 | 12 | 52 | 34 | 11 | Нет | 52 | Нет | 11 | Нет | Нет |
© 2005–2024 MDN contributors.
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
https://developer.mozilla.org/en-US/docs/Web/API/MediaDevices/devicechange_event