API и автоматизация встраивания
Управляйте туром со своего сайта через postMessage API: слушайте события зрителя и отправляйте команды встроенному туру.
Вы свяжете страницу своего сайта со встроенным туром и отреагируете на действия посетителя. Просмотрщик отправляет родительской странице три события и принимает две команды — этого достаточно, чтобы тур следовал за содержимым страницы, а публикацию можно было автоматизировать своими инструментами. Всё это работает без доступа к аккаунту: достаточно общедоступного фрейма с туром.
Слушаем просмотрщик
Встроенный просмотрщик отправляет сообщение родительскому окну, когда тур загрузился, когда посетитель сменил сцену и когда нажал хотспот. Подпишитесь на сообщения, проверьте поле type и прочитайте payload. Событие tourReady сообщает, что первый кадр уже на экране и просмотр можно измерять. Сообщения приходят в родительское окно, поэтому подписку ставит страница, а не тур.
- tourReady — тур загрузился, первая сцена показана.
- sceneChanged — посетитель перешёл в другую сцену, передан её идентификатор.
- hotspotClicked — активирован хотспот, передан его идентификатор.
Отправляем команды
- Сохраните ссылку на элемент iframe с туром в коде страницы.
- Отправляйте команды только после того, как пришло событие tourReady.
- goToScene открывает сцену с заданным идентификатором, чтобы посетитель следовал за текстом страницы.
- setUiMode переключает интерфейс между полным и минимальным видом.
Отправляйте сообщения только после события tourReady. Команда, пришедшая раньше, чем просмотрщик начал слушать, игнорируется, и позже тур на неё не отреагирует.
Собираем вместе
const frame = document.querySelector("iframe");
frame.addEventListener("message", (event) => {
const { type, payload } = event.data ?? {};
if (type === "tourReady") console.log("tour is ready", payload);
if (type === "sceneChanged") console.log("scene", payload.scene);
if (type === "hotspotClicked") console.log("hotspot", payload.hotspotId);
});
frame.contentWindow.postMessage({ type: "goToScene", payload: { scene: 4 } }, "*");
frame.contentWindow.postMessage({ type: "setUiMode", payload: { mode: "minimal" } }, "*");