I've been battling with the youtube iframe api for quite some time now. Somehow the method onYouTubeIframeAPIReady
is not always triggered.
From the symptoms it seems a loading problem. No errors are shown in the inspector.
Here is my code:
HTML
<div id="player"></div>
<script>
videoId = 'someVideoId';
var tag = document.createElement('script');
tag.src = "//www.youtube.com/iframe_api";
var firstScriptTag = document.getElementsByTagName('script')[0];
firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);
</script>
JS
(called at the end of the page. I tried to place the code right after the above script and the result was the same.)
var isReady = false
, player
, poster
, video;
$(function () {
$('.js-play').click(function (e) {
e.preventDefault();
interval = setInterval(videoLoaded, 100);
});
});
function onYouTubeIframeAPIReady() {
console.log(videoId)
player = new YT.Player('player', {
height: '445',
width: '810',
videoId: videoId,
events: {
'onReady': onPlayerReady//,
//'onStateChange': onPlayerStateChange
}
});
}
function onPlayerReady(event) {
isReady = true;
console.log("youtube says play")
}
function videoLoaded (){
if (isReady) {
console.log("ready and play")
poster.hide();
video.show();
$('body').trigger('fluidvideos');
player.playVideo();
clearInterval(interval);
}
}
The problem is that sometimes nothing gets printed by the console.log
and nothing happens.
On mobile phones this happens all the time. Any ideas?
I actually made this to lazy load the youtube player. Seems bullet proof to me.
It is not a timeout issue, and you should not need to fire this function manually.
Make sure your
onYouTubeIframeAPIReady
function is available at the global level, not nested (hidden away) within another function.If you load the IFrame Player API code asynchronously as follows:
and you are also loading the script code like this:
then the function
onYouTubeIframeAPIReady
won't be called due to the same code is being loaded twice (the function is called just one time when the api is completely loaded).So use just one of the ways according to your needs.
You can always append it to the window object to make sure it is evoked globally. This is helpful if your code is using amd.
I had a similar problem, In my case onYouTubeIframeAPIReady was being called so fast that the actual implementation wasn't ready for the right call. So after youtube player_api call I added a simple implementation with a var for verification of onYouTubeIframeAPIReady just like that:
Make sure you are testing the page by having it actually served on the web, not just loaded locally. YouTube iFrame API behavior is inconsistent/nondeterministic