У меня есть небольшое решение для цифровых вывесок, одно из требований - внедрить видео на YouTube. Я сделал это для одного видео - пока все хорошо. Я хочу, чтобы мои слайды могли содержать несколько видео, я хочу сделать это с помощью веб-компонентов, так как тогда я могу изолировать переменные JS (верно?).
Когда я работаю в контексте полной страницы, все работает так, как задумано. Я скопировал код в небольшой веб-компонент, но теперь мои события не вызываются.
Это была моя первая проблема. Моя вторая проблема заключается в том, как я могу дать своему веб-компоненту сигнал о начале воспроизведения (предположим, что на одной странице их несколько).
Разметка для страницы:
<div class="slide" data-slidetype="youtube">
<app-medianyoutube></app-medianyoutube>
</div>
JS-код для веб-компонента (функция на YouTubeIframeAPIReady никогда не вызывается).
//usage: <app-medianyoutube video=''></app-medianyoutube>
class MedianYoutube extends HTMLElement {
constructor() {
super();
console.log("constructor youtubeslide");
//var videoId = this.getAttribute("video");
//creates the player div to show the video
var maindiv = document.createElement("div");
maindiv.id = "player";
var tag = document.createElement("script");
tag.src = "https://www.youtube.com/iframe_api";
this.appendChild(maindiv);
this.appendChild(tag);
//this is the player and the function that is being called when the API is ready
var player;
function onYouTubeIframeAPIReady() {
console.log("on youtubeiframe api ready");
player = new YT.Player("player", {
height: "100%",
width: "100%",
videoId: "aQAEkgxNaQs",
events: {
onReady: onPlayerReady,
onStateChange: onPlayerStateChange
}
});
}
//handles when the player sends a message that it is ready for playback
function onPlayerReady(event) {
console.log("onPlayerReady");
event.target.playVideo();
}
//handles when the player sends a message that it is changing state
function onPlayerStateChange(event) {
console.log("onPlayerStateChange: " + event);
if (event.data == YT.PlayerState.ENDED) {
player.seekTo(0);
player.stopVideo();
showNextSlide();
done = true;
}
}
}
}
//register the component
customElements.define("app-medianyoutube", MedianYoutube);