Spec-Zone.ru › Web APIs

API презентаций

Ограниченная доступность

Эта функция не является базовой, так как она не работает в некоторых из наиболее широко используемых браузеров.

  • Узнать больше
  • Полная совместимость
  • Отправить отзыв

Безопасный контекст: Эта функция доступна только в безопасных контекстах (HTTPS) в некоторых или во всех поддерживающих браузерах.

Экспериментальная: Это экспериментальная технология
Перед использованием в рабочей среде внимательно изучите таблицу совместимости с браузерами.

API презентаций позволяет агенту пользователя (например, веб-браузеру) эффективно отображать веб-контент на больших устройствах для презентаций, таких как проекторы и подключенные к сети телевизоры. Поддерживаемые типы мультимедийных устройств включают как дисплеи, подключенные по проводам с помощью HDMI, DVI или аналогичных интерфейсов, так и беспроводные устройства, использующие DLNA, Chromecast, AirPlay или Miracast.

1-UA mode loaded the Controlling and Presenting pages together before outputting to displays. 2-UA mode loaded them separately using the Presentation Control Protocol.

В целом, веб-страница использует API контроллера презентаций для указания веб-контента, который должен отображаться на устройстве для презентаций, и для инициирования сеанса презентации. С помощью API приемника презентаций представляемый веб-контент получает статус сеанса. Предоставляя как странице-контроллеру, так и странице-приемнику канал на основе сообщений, веб-разработчик может реализовать взаимодействие между этими двумя страницами.

В зависимости от механизма подключения, предоставляемого устройством для презентаций, любую страницу-контроллер и страницу-приемник может отображать один и тот же агент пользователя или отдельные агенты пользователей.

  • Для устройств в режиме 1-UA обе страницы загружаются одним агентом пользователя. Однако результат отображения страницы-приемника будет отправлен на устройство для презентаций с помощью поддерживаемого протокола удаленного отображения.
  • Для устройств в режиме 2-UA страница-приемник загружается непосредственно на устройстве для презентаций. Управляющий агент пользователя общается с устройством для презентаций с помощью поддерживаемого протокола управления презентацией для управления сеансом презентации и передачи сообщений между двумя страницами.

Интерфейсы

Presentation

При управлении контекстом просмотра интерфейс Presentation предоставляет механизм для переопределения поведения браузера по запуску презентации на внешнем экране. При получении контекста просмотра интерфейс Presentation предоставляет доступ к имеющимся подключениям для презентаций.

PresentationRequest

Инициализирует или восстанавливает соединение с презентацией, созданной управляющим контекстом просмотра.

PresentationAvailability

Объект PresentationAvailability связан с доступными дисплеями для презентаций и представляет доступность дисплея для презентаций для запроса презентации.

PresentationConnectionAvailableEvent

Событие 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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API