当用户点击浏览器中的其他标签时,我想暂停视频。我试图用Youtube和Vimeo做到这一点。
这是javascript背后的基本理念:
对于Youtube:
//YouTube
var tag = document.createElement('script');
tag.src = "https://www.youtube.com/iframe_api";
var firstScriptTag = document.getElementsByTagName('script')[0];
firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);
var youtubePlayer;
var onYouTubeIframeAPIReady = function() {
youtubePlayer = new YT.Player('youtube', {
height: '390',
width: '640',
videoId: 'sXtekwuT8R0',
events: {
'onReady': onPlayerReady,
'onStateChange': onPlayerStateChange
}
});
};
var onPlayerReady = function(event) {
event.target.playVideo();
};
var onPlayerStateChange = function(event) {
if (event.data == YT.PlayerState.PLAYING) {
parent.focus();
window.onblur = function() {
status.text("You went away!");
youtubePlayer.stopVideo();
};
}
};
对于Vimeo(使用他们的Froogaloop库):
$(function() {
//Vimeo
var iframe = $('#vimeo');
var vimeoPlayer = $f(iframe[0]);
var status = $('#status');
vimeoPlayer.addEvent('ready', function() {
vimeoPlayer.addEvent('play', function(){
status.text("Playing!");
parent.focus();
window.onblur = function() {
status.text("You went away!");
vimeoPlayer.api("pause");
};
});
});
});
以下是这些尝试的一些代码示例:
的Youtube: http://codepen.io/earlonrails/pen/jugAm
Vimeo的: http://codepen.io/earlonrails/pen/KBAmd
如果单击播放按钮后,单击iframe的父文档,然后单击其他窗口或选项卡,则两个示例都将起作用。 Youtube示例在首次加载时也会起作用,但如果单击播放然后暂停然后播放则不会。我相信这两个问题都是由于您点击iframe这一事实,因此事件要么同时触发,要么无法触发,因为事件无法在那里捕获。我认为使用通过iframe发送的postMessages以及回调会使这项工作成功,但是我还是无法解决这个问题。
答案 0 :(得分:1)
需要在添加事件回调之前设置当前窗口,并在回调函数中使用此窗口变量。 IE
var myWindow = window;
vimeoPlayer.addEvent('play', function(){
status.text("Playing!");
myWindow.focus();
myWindow.onblur = function() {
status.text("You went away!");
vimeoPlayer.api("pause");
};
});
这些可以在之前链接的代码集示例中进行确认和测试:
Youtube:http://codepen.io/earlonrails/pen/jugAm
Vimeo:http://codepen.io/earlonrails/pen/KBAmd
我想在iframe中点击的窗口会在iframe窗口上设置onblur,然后永远不会被调用,但我仍然无法解释为什么当您点击iframe上的播放时,然后点击正文的页面,然后单击一个不同的选项卡然后它的工作原理。也许回调是从iframe中多次触发,或者postMessage被触发或仍在某个缓冲区中。