satya
satya

Reputation: 1959

stop all videos when a new video is played

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

  1. onStateChange event is not getting triggered(working)
  2. In this example i have 3 videos, in reality it has more videos instead of writing onPlayerStateChange for each video..is it possible to use an array for all the videos..and in the function onPlayerStateChange, to write player[].stopVideo() and this.playvideo()..something of this sort..(help required) please see this fiddle http://jsfiddle.net/LakshmiV/kn5Sf/ Please help.

Upvotes: 7

Views: 22257

Answers (4)

Muhammad Rizwan
Muhammad Rizwan

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

grmdgs
grmdgs

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

Venki
Venki

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();

    }
}

}

http://jsfiddle.net/Y8P7y/82/

Upvotes: 3

Anubhav Ranjan
Anubhav Ranjan

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

Related Questions