I have a Vimeo iframe video in Bootstrap video. I need to have it start playing when I trigger modal and stop playing when a modal is closed. Currently I can have in start p
I accomplished this by calling both the Bootstrap Modal API and Vimeo API, code below. You will need to include Vimeo's Froogaloop script as well, also below.
<script src="http://a.vimeocdn.com/js/froogaloop2.min.js"></script>
$('.modal').on('hidden.bs.modal', function () {
player.api('pause');
})
$('.modal').on('shown.bs.modal', function () {
player.api('play');
})
To add to eroedig's answer, check out Vimeo's documentation Calling the API with Froogaloop.
<iframe src="//player.vimeo.com/video/116160160?api=1&player_id=vimeoplayer&title=0&byline=0&portrait=0" name="vimeoplayer" id="nofocusvideo" width="615" height="346" frameborder="0" webkitallowfullscreen mozallowfullscreen allowfullscreen></iframe>
var iframe = document.getElementById('nofocusvideo');
<script src="http://a.vimeocdn.com/js/froogaloop2.min.js"></script>
<script>
var iframe = document.getElementById('nofocusvideo');
// $f == Froogaloop
var player = $f(iframe);
$('.modal').on('hidden.bs.modal', function () {
player.api('pause');
})
$('.modal').on('shown.bs.modal', function () {
player.api('play');
})
</script>
Refer to Vimeo's embedding documentation.
There is an attribute that you can set called autoplay
. They note that it might not work on some devices, but setting this attribute to 1
(or maybe true
) should help.
The code might look something like this:
jQuery('#myModal .modal-body iframe').attr({
src: 'the-source-code',
autoplay: 1
});
So I tried all the suggestions here and nothing was working quite as well as the updated documentation from Vimeo .. https://github.com/vimeo/player.js#pause-promisevoid-error
<script src="https://player.vimeo.com/api/player.js"></script>
<script>
var iframe = document.querySelector('iframe');
var player = new Vimeo.Player(iframe);
$('.modal').on('hidden.bs.modal', function () {
player.pause();
})
$('.modal').on('shown.bs.modal', function () {
player.play();
})
</script>
I tried using froogaloop2 but it always returned this error: Cannot read property 'ready' of undefined
Instead you can simply use postMessage
to call play
and pause
on the video inside the iframe
.
$(document).ready(function() {
var $iframe = $('#nofocusvideo'),
contentWindow = $iframe[0].contentWindow,
targetOriginUrl = $iframe.attr('src').split('?')[0];
$('.modal').on('hidden.bs.modal', function () {
contentWindow.postMessage({ 'method': 'pause' }, targetOriginUrl);
});
$('.modal').on('shown.bs.modal', function () {
contentWindow.postMessage({ 'method': 'play' }, targetOriginUrl);
});
});