API презентаций
Ограниченная доступность
Эта функция не является базовой, так как она не работает в некоторых из наиболее широко используемых браузеров.
Безопасный контекст: Эта функция доступна только в безопасных контекстах (HTTPS) в некоторых или во всех поддерживающих браузерах.
Экспериментальная: Это экспериментальная технология
Перед использованием в рабочей среде внимательно изучите таблицу совместимости с браузерами.
API презентаций позволяет агенту пользователя (например, веб-браузеру) эффективно отображать веб-контент на больших устройствах для презентаций, таких как проекторы и подключенные к сети телевизоры. Поддерживаемые типы мультимедийных устройств включают как дисплеи, подключенные по проводам с помощью HDMI, DVI или аналогичных интерфейсов, так и беспроводные устройства, использующие DLNA, Chromecast, AirPlay или Miracast.
В целом, веб-страница использует API контроллера презентаций для указания веб-контента, который должен отображаться на устройстве для презентаций, и для инициирования сеанса презентации. С помощью API приемника презентаций представляемый веб-контент получает статус сеанса. Предоставляя как странице-контроллеру, так и странице-приемнику канал на основе сообщений, веб-разработчик может реализовать взаимодействие между этими двумя страницами.
В зависимости от механизма подключения, предоставляемого устройством для презентаций, любую страницу-контроллер и страницу-приемник может отображать один и тот же агент пользователя или отдельные агенты пользователей.
- Для устройств в режиме 1-UA обе страницы загружаются одним агентом пользователя. Однако результат отображения страницы-приемника будет отправлен на устройство для презентаций с помощью поддерживаемого протокола удаленного отображения.
- Для устройств в режиме 2-UA страница-приемник загружается непосредственно на устройстве для презентаций. Управляющий агент пользователя общается с устройством для презентаций с помощью поддерживаемого протокола управления презентацией для управления сеансом презентации и передачи сообщений между двумя страницами.
Интерфейсы
Presentation-
При управлении контекстом просмотра интерфейс
Presentationпредоставляет механизм для переопределения поведения браузера по запуску презентации на внешнем экране. При получении контекста просмотра интерфейсPresentationпредоставляет доступ к имеющимся подключениям для презентаций. PresentationRequest-
Инициализирует или восстанавливает соединение с презентацией, созданной управляющим контекстом просмотра.
-
Объект PresentationAvailability связан с доступными дисплеями для презентаций и представляет доступность дисплея для презентаций для запроса презентации.
-
Событие
PresentationConnectionAvailableEventсрабатывает наPresentationRequestпри создании подключения, связанного с объектом. PresentationConnection-
Каждое подключение для презентации представлено объектом PresentationConnection.
PresentationConnectionCloseEvent-
Событие
PresentationConnectionCloseEventсрабатывает, когда подключение для презентации переходит в состояниеclosed. PresentationReceiver-
Интерфейс PresentationReceiver позволяет контексту просмотра-приемнику получить доступ к контекстам просмотра-контроллерам и общаться с ними.
PresentationConnectionList-
PresentationConnectionListпредставляет собой набор не завершенных подключений для презентаций. Он также служит монитором события о новом доступном подключении для презентации.
Пример
Примеры кода ниже демонстрируют использование основных функций API презентаций: controller.html реализует контроллер, а presentation.html реализует презентацию. Обе страницы предоставляются из домена https://example.org (https://example.org/controller.html и https://example.org/presentation.html). Эти примеры предполагают, что управляющая страница управляет одной презентацией за раз. Дополнительные сведения см. в комментариях к примерам кода.
Мониторинг доступности дисплеев для презентаций
В controller.html:
<button id="presentBtn" style="display: none;">Present</button>
<script>
// The Present button is visible if at least one presentation display is available
const presentBtn = document.getElementById("presentBtn");
// It is also possible to use relative presentation URL e.g. "presentation.html"
const presUrls = [
"https://example.com/presentation.html",
"https://example.net/alternate.html",
];
// Show or hide present button depending on display availability
const handleAvailabilityChange = (available) => {
presentBtn.style.display = available ? "inline" : "none";
};
// Promise is resolved as soon as the presentation display availability is known.
const request = new PresentationRequest(presUrls);
request
.getAvailability()
.then((availability) => {
// availability.value may be kept up-to-date by the controlling UA as long
// as the availability object is alive. It is advised for the web developers
// to discard the object as soon as it's not needed.
handleAvailabilityChange(availability.value);
availability.onchange = () => {
handleAvailabilityChange(availability.value);
};
})
.catch(() => {
// Availability monitoring is not supported by the platform, so discovery of
// presentation displays will happen only after request.start() is called.
// Pretend the devices are available for simplicity; or, one could implement
// a third state for the button.
handleAvailabilityChange(true);
});
</script>
Запуск новой презентации
В controller.html:
<script>
presentBtn.onclick = () => {
// Start new presentation.
request
.start()
// The connection to the presentation will be passed to setConnection on success.
.then(setConnection);
// Otherwise, the user canceled the selection dialog or no screens were found.
};
</script>
Восстановление подключения к презентации
В файле controller.html:
<button id="reconnectBtn" style="display: none;">Reconnect</button>
<script>
const reconnect = () => {
// read presId from localStorage if exists
const presId = localStorage["presId"];
// presId is mandatory when reconnecting to a presentation.
if (presId) {
request
.reconnect(presId)
// The new connection to the presentation will be passed to
// setConnection on success.
.then(setConnection);
// No connection found for presUrl and presId, or an error occurred.
}
};
// On navigation of the controller, reconnect automatically.
document.addEventListener("DOMContentLoaded", reconnect);
// Or allow manual reconnection.
reconnectBtn.onclick = reconnect;
</script>
Инициализация презентации управляющим агентом пользователя
В файле controller.html:
<script>
navigator.presentation.defaultRequest = new PresentationRequest(presUrls);
navigator.presentation.defaultRequest.onconnectionavailable = (evt) => {
setConnection(evt.connection);
};
</script>
Установка presentation.defaultRequest позволяет странице указать PresentationRequest для использования при инициализации презентации управляющим агентом пользователя.
Мониторинг состояния подключений и обмен данными
В controller.html:
<button id="disconnectBtn" style="display: none;">Disconnect</button>
<button id="stopBtn" style="display: none;">Stop</button>
<button id="reconnectBtn" style="display: none;">Reconnect</button>
<script>
let connection;
// The Disconnect and Stop buttons are visible if there is a connected presentation
const stopBtn = document.querySelector("#stopBtn");
const reconnectBtn = document.querySelector("#reconnectBtn");
const disconnectBtn = document.querySelector("#disconnectBtn");
stopBtn.onclick = () => {
connection?.terminate();
};
disconnectBtn.onclick = () => {
connection?.close();
};
function setConnection(newConnection) {
// Disconnect from existing presentation, if not attempting to reconnect
if (
connection &&
connection !== newConnection &&
connection.state !== "closed"
) {
connection.onclose = undefined;
connection.close();
}
// Set the new connection and save the presentation ID
connection = newConnection;
localStorage["presId"] = connection.id;
function showConnectedUI() {
// Allow the user to disconnect from or terminate the presentation
stopBtn.style.display = "inline";
disconnectBtn.style.display = "inline";
reconnectBtn.style.display = "none";
}
function showDisconnectedUI() {
disconnectBtn.style.display = "none";
stopBtn.style.display = "none";
reconnectBtn.style.display = localStorage["presId"] ? "inline" : "none";
}
// Monitor the connection state
connection.onconnect = () => {
showConnectedUI();
// Register message handler
connection.onmessage = (message) => {
console.log(`Received message: ${message.data}`);
};
// Send initial message to presentation page
connection.send("Say hello");
};
connection.onclose = () => {
connection = null;
showDisconnectedUI();
};
connection.onterminate = () => {
// Remove presId from localStorage if exists
delete localStorage["presId"];
connection = null;
showDisconnectedUI();
};
}
</script>
Мониторинг доступных подключений и приветствие
В presentation.html:
const addConnection = (connection) => {
connection.onmessage = (message) => {
if (message.data === "Say hello") connection.send("hello");
};
};
navigator.presentation.receiver.connectionList.then((list) => {
list.connections.forEach((connection) => {
addConnection(connection);
});
list.onconnectionavailable = (evt) => {
addConnection(evt.connection);
};
});
Передача информации о языке с сообщением
В файле controller.html:
<script>
connection.send('{"string": "你好,世界!", "lang": "zh-CN"}');
connection.send('{"string": "こんにちは、世界!", "lang": "ja"}');
connection.send('{"string": "안녕하세요, 세계!", "lang": "ko"}');
connection.send('{"string": "Hello, world!", "lang": "en-US"}');
</script>
В файле presentation.html:
<script>
connection.onmessage = (message) => {
const messageObj = JSON.parse(message.data);
const spanElt = document.createElement("SPAN");
spanElt.lang = messageObj.lang;
spanElt.textContent = messageObj.string;
document.body.appendChild(spanElt);
};
</script>
Спецификации
| Спецификация |
|---|
| API презентаций # interface-presentation |
Совместимость с браузерами
| Рабочие столы | Мобильные устройства | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|
| Chrome | Edge | Firefox | Opera | Safari | Chrome Android | Firefox для Android | Opera Android | Safari на iOS | Samsung Internet | WebView Android | |
Presentation_API |
47 | 79 | Нет | 34 | Нет | 47 | Нет | 34 | Нет | 5.0 | Нет |
defaultRequest |
47 | 79 | Нет | 34 | Нет | 47 | Нет | 34 | Нет | 5.0 | Нет |
receiver |
59 | 79 | Нет | 46 | Нет | 59 | Нет | 43 | Нет | 7.0 | Нет |
См. также
Поддержка API презентаций содержит JavaScript-полифилл спецификации API презентаций, находящейся на стадии стандартизации в рамках рабочей группы Second Screen Working Group в W3C. Полифилл в основном предназначен для изучения способов реализации API презентаций на основе различных механизмов презентаций.
© 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/Presentation_API