При использовании YouTube iframe API никогда не вызывается onPlayerReady, а проигрыватели загружаются только частично.
Я пробовал некоторые вещи из других сообщений:
Здесь было предложено два решения:
Установка переменной origin
в соответствии с доменом сервера: я пытался установить ее как в атрибуте iframe src
в теге HTML, так и вplayerVars
при инициализации проигрывателя.Похоже, никаких изменений не произошло.
Замена <iframe>
для <div>
тегов: это работало в других проектах, но не здесь.Вместо этого я получаю сообщение об ошибке, которого у меня никогда не было, когда javascript пытается создать плеер:
Uncaught TypeError: tubeId.indexOf is not a function
at returnFn (mytube.js:3115)
at Xg.c [as R] (www-embed-player.js:519)
at gh (www-embed-player.js:513)
at dh (www-embed-player.js:512)
at Xg.a.w (www-embed-player.js:509)
at $g (www-embed-player.js:510)
at Xg.h.da (www-embed-player.js:505)
at www-embed-player.js:533
На сайте есть два игрока, и хотя я заменил теги только в одном из нихОба игрока начали выдавать эту ошибку.Кроме того, переменные проигрывателя теперь возвращают undefined
.
В этом посте говорится, что решение устанавливает enablejsapi
на 1, но я уже сделал это в теге HTML iframe.
Эти ошибки встречаются не на всех компьютерах.Все они были обнаружены на компьютере с Windows 8 под управлением Google Chrome (не удалось протестировать в других браузерах).То же самое произошло в Google Chrome на MacOS (хотя я не смог протестировать последние изменения, которые вызвали ошибку mytube.js).На моем компьютере (Windows 7, протестировал сайт на Chrome и Firefox) все работает в основном хорошо, за исключением случайной ошибки «Не удалось выполнить postMessage» на «DOMWindow» (он говорит, что источник проигрывателя установлен на http://www.youtube.com, хотя я его уже заменил).Эта ошибка появляется не всегда, но, возможно, в 30% случаев.
Вот как я создаю игроков:
HTML:
<iframe id="video1" type="text/html" src="https://www.youtube.com/embed/?rel=0&enablejsapi=1&origin=https://mywebsite.com"></iframe>
<!-- Video ID is loaded on user interaction, using loadVideoById() -->
JS /jQuery:
$(document).ready(function() {
loadYouTubeAPI();
});
function loadYouTubeAPI(){
var tag = document.createElement('script');
tag.src = "https://www.youtube.com/iframe_api";
var firstScriptTag = document.getElementsByTagName('script')[0];
firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);
}
function onYouTubeIframeAPIReady() {
player = new YT.Player('video1', {
playerVars: {'origin':'https://mywebsite.com/'},
events: {
'onReady': onPlayerReady1
},
});
}
function onPlayerReady1(event) { //I have different players that do different things when ready; I need different names for each onPlayerReady function
(...)
}
Здесь - скриншоты того, как консоль возвращает переменные игрока: слева - как создаются игроки сейчас, справа - как они должны быть.На левом изображении игроку не хватает всех методов, поэтому я не могу его контролировать.