Reputation: 1959
I need some help with Youtube API and embeded videos. I want to stop all iframe videos (here i have taken only 3, but there are several videos)running on the current page when a new youtube video is clicked. At one point of time, only one iframe youtube video should run. I have gone thruogh documentation [https://developers.google.com/youtube/js_api_reference][1] and was able to write till here...
Updated:
<!DOCTYPE html>
<html>
<head>
<title></title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<script type="text/javascript" src="http://www.youtube.com/player_api"></script>
<script type="text/javascript">
var player;
function onYouTubeIframeAPIReady() {
player = new YT.Player('player', {
events: {
'onReady': onPlayerReady,
'onStateChange': onPlayerStateChange
}
});
}
var done = false;
function onPlayerStateChange(event) {
if (event.data == YT.PlayerState.PLAYING && !done) {
alert("hi5");
player1.stopVideo();
player2.stopVideo();
done = true;
}
}
</script>
</head>
<body>
<div>TODO write content</div>
<ul class="image-grid" id="list">
<li>
<iframe id="player" width="385" height="230" src="http://www.youtube.com/embed/erDxb4IkgjM?rel=0&wmode=Opaque&enablejsapi=1;showinfo=0;controls=0" frameborder="0" allowfullscreen></iframe>
</li>
<li>
<iframe id="player1" width="385" height="230" src="http://www.youtube.com/embed/wSrA5iQGlDc?rel=0&wmode=Opaque&enablejsapi=1;showinfo=0;controls=0" frameborder="0" allowfullscreen></iframe>
</li>
<li>
<iframe id="player2" width="385" height="230" src="http://www.youtube.com/embed/c7b_WLkztXc?rel=0&wmode=Opaque&enablejsapi=1;showinfo=0;controls=0" frameborder="0" allowfullscreen></iframe>
</li>
</ul>
</body>
</html>
UPDATED
Upvotes: 7
Views: 22257
Reputation: 36
Replace the EMBEDYOUTUBEURL with your exact YouTube URL.
jQuery(“.career_video_frame”).on(“click”, function(e) {
e.preventDefault();
let original_src = jQuery(“.owl-item.active .career_video_frame iframe”)[0].src;
jQuery(“.career_video_frame .career_overlay”).removeClass(“positionRelative”);
jQuery(“iframe”).each(function() {
framesrc = this.src;
updateframesrc = framesrc.replace(‘&autoplay=1’, ”);
// jQuery(this).attr(“src”, updateframesrc);
jQuery(this)[0].contentWindow.postMessage(‘{“event”:”command”,”func”:”stopVideo”,”args”:””}’, ‘*’);
// console.log(updateframesrc);
});
let frame_ID = jQuery(this).attr(“id”);
jQuery(“.career_video_frame#” + frame_ID + ” .career_overlay”).addClass(“positionRelative”);
jQuery(“.owl-item.active .career_video_frame#” + frame_ID + ” iframe”)[0].src = original_src + “&autoplay=1”;
// console.log(frame_ID);
});
.career_overlay {
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
cursor: pointer;
}
.career_overlay.positionRelative {
position: relative;
}
<div id=”frm_0″ class=”t-entry-visual-cont career_video_frame”>
<div class=”career_overlay”></div>
<iframe src=”https://www.EMBEDYOUTUBEURL.com?feature=oembed&width=640&height=390&showinfo=0&rel=0&enablejsapi=1″ width=”640″ height=”360″ frameborder=”0″ allowfullscreen=”allowfullscreen”></iframe>
</div>
<div id=”frm_1″ class=”t-entry-visual-cont career_video_frame”>
<div class=”career_overlay”></div>
<iframe src=”https://www.EMBEDYOUTUBEURL.com?feature=oembed&width=640&height=390&showinfo=0&rel=0&enablejsapi=1″ width=”640″ height=”360″ frameborder=”0″ allowfullscreen=”allowfullscreen”></iframe>
</div>
Upvotes: 0
Reputation: 585
Great answer by Coby to a similar question at https://stackoverflow.com/a/13260520/835822
Using an attribute selector you can target any iframe that comes from Youtube and then using jQuery's each you can loop through all of them.
$(function(){
$('iframe[src*="http://www.youtube.com/embed/"]').each(function(i) {
this.contentWindow.postMessage('{"event":"command","func":"pauseVideo","args":""}', '*');
});
});
Upvotes: 6
Reputation: 33
Good concept, but event.target.a.src doesn't work! Changed it to event.target.getVideoUrl() and it works fine. check it out here
function onPlayerStateChange(event) {
if (event.data == YT.PlayerState.PLAYING) {
var temp = event.target.getVideoUrl();
var tempPlayers = $("iframe.yt_players");
for (var i = 0; i < players.length; i++) {
if (players[i].getVideoUrl() != temp) players[i].stopVideo();
}
}
}
Upvotes: 3
Reputation: 1598
You can do something like this...
Give every iframe a class so that it can be identified as an iframe for youtube player. Here I have given "yt_players"
Now you can use the below code...
<script type="text/javascript">
players = new Array();
function onYouTubeIframeAPIReady() {
var temp = $("iframe.yt_players");
for (var i = 0; i < temp.length; i++) {
var t = new YT.Player($(temp[i]).attr('id'), {
events: {
'onStateChange': onPlayerStateChange
}
});
players.push(t);
}
}
onYouTubeIframeAPIReady();
function onPlayerStateChange(event) {
if (event.data == YT.PlayerState.PLAYING) {
var temp = event.target.a.src;
var tempPlayers = $("iframe.yt_players");
for (var i = 0; i < players.length; i++) {
if (players[i].a.src != temp)
players[i].stopVideo();
}
}
}
</script>
Have updated the code...This should be of help to you.
See it in here...http://jsfiddle.net/anubhavranjan/Y8P7y/
Upvotes: 10