Вот jsfiddle для этого проекта: http://jsfiddle.net/frankzfaz/bweH4/13/встроенный IFrame элемент не работает с YouTube IFrame API
Элементы IFRAME элементы я хочу использовать загружаются в HTML с помощью JavaScript, когда кнопка нажата:
document.getElementById('iframeload').innerHTML = '<iframe id="ytplayer" type="text/html" width="300" height="300" src="https://www.youtube.com/embed/' + metalMusicVid[indexVid].youTubeId + '?enablejsapi=1&modestbranding=1&rel=0&iv_load_policy=3&showinfo=0&controls=0&autoplay=1" frameborder="0" allowfullscreen></iframe>';
Как вы можете видеть, «metalMusicVid [indexVid] .youTubeId» вытягивает идентификаторы видео youtube из массива js. Вот как я хочу, чтобы он работал.
Я хочу, чтобы это работало с слушателями событий youtube api. Как видно здесь:
var tag = document.createElement('script');
tag.src = "https://www.youtube.com/iframe_api";
var firstScriptTag = document.getElementsByTagName('script')[0];
firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);
// youtube player api stuff
function onYouTubePlayerReady(playerId) {
var player = document.getElementById("ytplayer");
player.addEventListener("onStateChange", "onytplayerStateChange");
player.addEventListener("onError", "onPlayerError");
// get current time and display it.
setInterval(function(){document.getElementById('vidTime').innerHTML = "Current: " + pad(Math.floor(player.getCurrentTime()/60)) + ":" + pad(Math.floor(player.getCurrentTime() % 60))}, 1000);
// pads number with extra zeros, looking more like a real digital clock
function pad(val) {
var valString = val + "";
if (valString.length < 2) {
return "0" + valString;
} else {
return valString;
}
}
}
function onytplayerStateChange(newState) {
//console.log("New state " + newState);
if(newState === 0){alert('the youtube api is working')}
if(newState === -1){alert('the youtube api is working')}
}
function onPlayerError(errorCode) {
console.log("New ERROR " + errorCode);
}
Это работает с объектом встраивается, но я хочу использовать плавающие фреймы, так что лучше работает с IPADS и мобильными устройствами. И нет, я не хочу загружать iframes из самого api, как видно из документации Google, потому что каждый идентификатор видео загружается из массива javscript.
Все, что мне нужно, это прослушиватели событий, чтобы забрать новый iframe из его идентификатора элемента.
URL: http://jsfiddle.net/frankzfaz/bweH4/13/
Я попробовал это, не повезло. Вероятно, потому что iframe не загружается при загрузке страницы, он загружается только при активации функции (через кнопку html). Я могу заменить «playerId» идентификатором iframe? Потому что я попробовал это, не повезло. – frankzfaz
playerId может быть либо самим элементом DOM (т. Е. Объектом, созданным с помощью document.getElementById), либо может быть только атрибутом ID iframe, как вы предлагаете. Тем не менее, вы правы, что если сам iframe не загружается до тех пор, пока не будет активирована другая функция, тогда этот код не будет работать (поскольку он запускается, как только вставляется библиотека кода). Тогда вы захотите сделать код, который создает объект YT.Player, для любой функции, которую запускает кнопка HTML, и просто убедитесь, что iframe полностью загружен до запуска. – jlmcdonald
Я попытался выполнить функцию onYouTubeIframeAPIReady() {etc ...} внутри функции после iframe. Не работает. Почему это не работает? Должен ли я использовать функцию setTimeout, чтобы заставить onYouTubeIframeAPIReady() загружаться после того, как iframe помещается функцией? – frankzfaz