【发布时间】:2011-11-24 09:47:27
【问题描述】:
当 youtube 视频结束时,我如何让 fancybox 自动关闭?
【问题讨论】:
标签: youtube fancybox auto-close
当 youtube 视频结束时,我如何让 fancybox 自动关闭?
【问题讨论】:
标签: youtube fancybox auto-close
这并不像听起来那么简单:
onStateChange 事件侦听器,以便确定视频何时结束(零值表示视频已结束)$.fancybox.close方法关闭弹窗或者,您可以让用户关闭弹出窗口。
【讨论】:
这是带有 Fancybox-Youtube-Cookie-Autoclose-Autopopup 的完整脚本,只需下载 css 中所需的图像,将它们放在根目录的 /fancybox 文件夹中并替换为您的视频 ID。确实有效,经过全面测试...
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script>
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/fancybox/2.1.5/jquery.fancybox.min.js"></script>
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/fancybox/2.1.5/helpers/jquery.fancybox-media.js"></script>
<link rel="stylesheet" type="text/css" href="https://cdnjs.cloudflare.com/ajax/libs/fancybox/2.1.5/jquery.fancybox.min.css" media="screen" />
<script type="text/javascript" src="http://cdnjs.cloudflare.com/ajax/libs/jquery-cookie/1.4.1/jquery.cookie.min.js"></script>
<script src="http://www.youtube.com/player_api"></script>
<script type="text/javascript">
// detect mobile devices features
var isTouchSupported = 'ontouchstart' in window,
isTouchSupportedIE10 = navigator.userAgent.match(/Touch/i) != null;
function onPlayerReady(event) {
if (!(isTouchSupported || isTouchSupportedIE10)) {
// this is NOT a mobile device so autoplay
event.target.playVideo();
}
}
function onPlayerStateChange(event) {
if (event.data === 0) {
$.fancybox.close();
}
}
function onYouTubePlayerAPIReady() {
$(function() {
if ($.cookie('welcome_video')) {
// it hasn't been three days yet
} else {
// set cookie to expire in 3 days
$.cookie('welcome_video', 'true', { expires: 3});
$(document).ready(function () {
$.fancybox.open({
href: "https://www.youtube.com/embed/qm1RjPM9E-g", /*YOUR VIDEO ID*/
helpers: {
media: {
youtube: {
params: {
autoplay: 1,
rel: 0,
// controls: 0,
showinfo: 0,
autohide: 1,
}
}
},
buttons: {}
},
beforeShow: function () {
var id = $.fancybox.inner.find('iframe').attr('id');
var player = new YT.Player(id, {
events: {
onReady: onPlayerReady,
onStateChange: onPlayerStateChange
}
});
}
}); // fancybox
}); // ready
} // cookie else ready
}); // function for cookie
} // youtube API ready
</script>
【讨论】:
在没有任何运气的情况下环顾四周后,我想出了一个解决方案
看看我们做了什么,在这里观看视频
<div style="display: none;">
<div id="player"></div>
</div>
<script src="http://www.youtube.com/player_api"></script>
<script>
$(document).ready(function () {
$("a.video_button").fancybox({
'titlePosition' : 'inside',
'transitionIn' : 'none',
'transitionOut' : 'none'
});
});
// create youtube player
var player;
function onYouTubePlayerAPIReady() {
player = new YT.Player('player', {
height: '390',
width: '640',
videoId: 's19V_6Ay4No',
events: {
'onReady': onPlayerReady,
'onStateChange': onPlayerStateChange
}
});
}
// autoplay video
function onPlayerReady(event) {
}
// when video ends
function onPlayerStateChange(event) {
if(event.data === 0) {
$(document).ready(function () { parent.$.fancybox.close();});
}
}
</script>
【讨论】:
是的,这是处理fancybox 或colorbox 的正确方法。 Youtube Video API 提供了不同的状态来处理这个问题,比如 unstarted=-1、ended=0、playing=1、paused=2、buffering=3、video cued=5
在fancybox jquery 代码块中获取或捕获此状态可以轻松实现。也可以通过适当的演示访问这篇文章。Visit here
【讨论】: