11
votes

I've made a popup and placed a youtube video in it. I set video to autoplay. But the problem is video plays when i open the page. It is auto play in global and i want it to autoplay when popup shows. I did not find any solution for it.

Currently, It playing like i have background ghost saying something. Can anyone help?

Video Html

    <iframe width="800" height="315" src="http://www.youtube.com/embed/?wmode=opaque&amp;autoplay=1&amp;rel=0&amp;color=white" frameborder="0"></iframe><a href="http://www.youtube.com" target="_blank"><img alt="" class="watermark" src="https://encrypted-tbn1.gstatic.com/images?q=tbn:ANd9GcQHcbyVSjHQlwCy3tYqOyLwSWDO4tblhxTVVjKV5R0PtFsPy9TwfA" /></a></div>
    </div>

Calling popup

 <a href="#" data-reveal-id="video_pop"><img src="kaow.png"/></a>
    </div>

Popup Content

<div id="video_pop" class="reveal-modal medium">
    <a class="close-reveal-modal"></a>
     <div>

    <iframe width="800" height="315" src="http://www.youtube.com/embed/?wmode=opaque&amp;autoplay=1&amp;rel=0&amp;color=white" frameborder="0"></iframe><a href="http://www.youtube.com" target="_blank"><img alt="" class="watermark" src="https://encrypted-tbn1.gstatic.com/images?q=tbn:ANd9GcQHcbyVSjHQlwCy3tYqOyLwSWDO4tblhxTVVjKV5R0PtFsPy9TwfA" /></a></div>
    </div>

JS

Foundation.libs.reveal = {
    name: "reveal",
    version: "4.2.2",
    locked: !1,
    settings: {
        animation: "fadeAndPop",
        animationSpeed: 250,
        closeOnBackgroundClick: !0,
        closeOnEsc: !0,
        dismissModalClass: "close-reveal-modal",
        bgClass: "reveal-modal-bg",
        open: function() {},
        opened: function() {},
        close: function() {},
        closed: function() {},
        bg: a(".reveal-modal-bg"),
        css: {
            open: {
                opacity: 0,
                visibility: "visible",
                display: "block"
            },
            close: {
                opacity: 1,
                visibility: "hidden",
                display: "none"
            }
        }
    },
    init: function(b, c, d) {
        return Foundation.inherit(this, "data_options delay"), "object" == typeof c ? a.extend(!0, this.settings, c) : "undefined" != typeof d && a.extend(!0, this.settings, d), 
        "string" != typeof c ? (this.events(), this.settings.init) : this[c].call(this, d);
    },
    events: function() {
        var b = this;
        return a(this.scope).off(".fndtn.reveal").on("click.fndtn.reveal", "[data-reveal-id]", function(c) {
            c.preventDefault();
            if (!b.locked) {
                var d = a(this), e = d.data("reveal-ajax");
                b.locked = !0;
                if ("undefined" == typeof e) b.open.call(b, d); else {
                    var f = e === !0 ? d.attr("href") : e;
                    b.open.call(b, d, {
                        url: f
                    });
                }
            }
        }).on("click.fndtn.reveal", this.close_targets(), function(c) {
            c.preventDefault();
            if (!b.locked) {
                var d = a.extend({}, b.settings, b.data_options(a(".reveal-modal.open")));
                if (a(c.target)[0] === a("." + d.bgClass)[0] && !d.closeOnBackgroundClick) return;
                b.locked = !0, b.close.call(b, a(this).closest(".reveal-modal"));
            }
        }).on("open.fndtn.reveal", ".reveal-modal", this.settings.open).on("opened.fndtn.reveal", ".reveal-modal", this.settings.opened).on("opened.fndtn.reveal", ".reveal-modal", this.open_video).on("close.fndtn.reveal", ".reveal-modal", this.settings.close).on("closed.fndtn.reveal", ".reveal-modal", this.settings.closed).on("closed.fndtn.reveal", ".reveal-modal", this.close_video), 
        a("body").bind("keyup.reveal", function(c) {
            var d = a(".reveal-modal.open"), e = a.extend({}, b.settings, b.data_options(d));
            27 === c.which && e.closeOnEsc && d.foundation("reveal", "close");
        }), !0;
    },
    open: function(b, c) {
        if (b) if ("undefined" != typeof b.selector) var d = a("#" + b.data("reveal-id")); else {
            var d = a(this.scope);
            c = b;
        } else var d = a(this.scope);
        if (!d.hasClass("open")) {
            var e = a(".reveal-modal.open");
            "undefined" == typeof d.data("css-top") && d.data("css-top", parseInt(d.css("top"), 10)).data("offset", this.cache_offset(d)), 
            d.trigger("open"), e.length < 1 && this.toggle_bg(d);
            if ("undefined" == typeof c || !c.url) this.hide(e, this.settings.css.close), this.show(d, this.settings.css.open); else {
                var f = this, g = "undefined" != typeof c.success ? c.success : null;
                a.extend(c, {
                    success: function(b, c, h) {
                        a.isFunction(g) && g(b, c, h), d.html(b), a(d).foundation("section", "reflow"), 
                        f.hide(e, f.settings.css.close), f.show(d, f.settings.css.open);
                    }
                }), a.ajax(c);
            }
        }
    },
    close: function(b) {
        var b = b && b.length ? b : a(this.scope), c = a(".reveal-modal.open");
        c.length > 0 && (this.locked = !0, b.trigger("close"), this.toggle_bg(b), this.hide(c, this.settings.css.close));
    },
    close_targets: function() {
        var a = "." + this.settings.dismissModalClass;
        return this.settings.closeOnBackgroundClick ? a + ", ." + this.settings.bgClass : a;
    },
    toggle_bg: function(b) {
        0 === a(".reveal-modal-bg").length && (this.settings.bg = a("<div />", {
            "class": this.settings.bgClass
        }).appendTo("body")), this.settings.bg.filter(":visible").length > 0 ? this.hide(this.settings.bg) : this.show(this.settings.bg);
    },

EDITED:

I am using Foundation 5 Reveal Model for popup: http://foundation.zurb.com/docs/components/reveal.html

4

4 Answers

10
votes

I think you want something like that :

LIVE EXAMPLE

Basically i use the API Javascript to add actions play and pause to the video.

And i use default function of Foundation to add an event when to the player.

HTML

 <a href="#" data-reveal-id="myModal">Click Me For A Modal</a>

  <div id="myModal" class="reveal-modal" data-reveal>
    <h2>Awesome</h2>
    <div id="player"></div>
    <a class="close-reveal-modal">&#215;</a>
  </div>

JS

var tag = document.createElement('script');

tag.src = "https://www.youtube.com/iframe_api";
var firstScriptTag = document.getElementsByTagName('script')[0];
firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);

// 3. This function creates an <iframe> (and YouTube player)
//    after the API code downloads.
var player;

function onYouTubeIframeAPIReady() {
    player = new YT.Player('player', {
        height: '315',
        width: '560',
        videoId: 'l-gQLqv9f4o',
        events: {
            'onStateChange': onPlayerStateChange
        }
    });
}


function onPlayerStateChange(event) {
    if (event.data == YT.PlayerState.PLAYING) {
      //player is playing
    } else {
      //player is paused
    }
}

function stopVideo() {
    player.stopVideo();
}

function playVideo() {
  player.playVideo();
}

function pauseVideo() {
  player.pauseVideo();
}


$(document).on('opened.fndtn.reveal', '[data-reveal]', function () {
    playVideo();
});

$(document).on('closed.fndtn.reveal', '[data-reveal]', function () {
  pauseVideo();
});
4
votes

From the YouTube JavaScript Player API Reference:

The JavaScript API allows users to control the YouTube chromeless or embedded video players via JavaScript. Calls can be made to play, pause, seek to a certain time in a video, set the volume, mute the player, and other useful functions.

You can use the API's player.playVideo(), player.pauseVideo() and player.stopVideo() method.

0
votes

So, Ive read a bunch of different threads on this and most of what Ive seen is pretty complicated. I went a much more simple route.

    $('.reveal-overlay').click(function(e){
    var loc = document.getElementById('myFrame').src;
    var stoploc = loc.replace("?autoplay=1", "");
    document.getElementById('myFrame').setAttribute('src', stoploc);
    });

    $('.playVideo').click(function(e){
    var loc = document.getElementById('myFrame').src;
    var autoloc = loc + "?autoplay=1";
    document.getElementById('myFrame').setAttribute('src', autoloc);
    });

This will basically just append ?autoplay=1 to a YouTube video once the modal is opened. The class .playVideo is on whatever button youre using to open your modal window.

The class .reveal-overlay is created by Foundation. So when the overlay is clicked it removes any ?autoplay=1 from the video url.

Hope this helps anyone running into this problem. It's simple and should work for multiple different videos, plus, if someone has js turned off, it won't play anything in the background.

One more thing, the video you load should be a regular non-autoplay video. This will turn it into an autoplay after clicked ony and return it to non-autoplay when closed.

-1
votes

Thanks to @Jarod Means script! It works and I uses it since it only requires jQuery (Simple solution = Great solution). But I developed it for multiple video clips, which is great in slideshows, as an example or whenever you need this solution for more then one clip in the same dom. I also made it so it is completely in jQuery.

Just posting it so you can use it as you wish.

<!DOCTYPE html>
<html>
<head>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script>
    <meta charset="utf-8">
    <title>Youtube-player test</title> 
    <style>
        .youtube-player iframe {
            display: none;
        }

        .youtube-player.active iframe {
            display: block;
        }
    </style>
</head>
<body>
    <div class="youtube-player">
        <iframe width="560" height="315" src="https://www.youtube.com/embed/XzXjuDM_Z54" frameborder="0" allowfullscreen></iframe>
        <a href="#" class="youtube-link-start">Open window</a>
        <a href="#" class="youtube-link-stop">Close window</a>
    </div>
    <div class="youtube-player">
        <iframe width="560" height="315" src="https://www.youtube.com/embed/l2EYyzXJIdE" frameborder="0" allowfullscreen></iframe>
        <a href="#" class="youtube-link-start">Open window</a>
        <a href="#" class="youtube-link-stop">Close window</a>
    </div>

    <script>

        jQuery('.youtube-player').each(function(){
            jQuery(this).on('click', '.youtube-link-start', function(){
                jQuery(this).parent().addClass('active');

                var loc = $(this).siblings('iframe').attr('src');
                var startloc = loc + "?autoplay=1";
                $(this).siblings('iframe').attr('src', startloc);
            });

            jQuery(this).on('click', '.youtube-link-stop', function(){
                jQuery(this).parent().removeClass('active');

                var loc = $(this).siblings('iframe').attr('src');
                var stoploc = loc.replace("?autoplay=1", "");
                $(this).siblings('iframe').attr('src', stoploc);
            });
        });
    </script>
</body>
</html>

I guess you can keep on changing/developing this with html, css and jQuery to whatever fit your needs. :)