0

当用户单击浏览器中的另一个选项卡时,我想暂停视频。我曾尝试使用 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");
      };
    });
  });
});

以下是这些尝试的一些 codepen 示例:

优酷:http : //codepen.io/earlonrails/pen/jugAm

Vimeo: http ://codepen.io/earlonrails/pen/KBAmd

如果单击播放按钮后,单击 iframe 的父文档,然后单击不同的窗口或选项卡,这两个示例都将起作用。Youtube 示例在首次加载时也可以使用,但如果您单击播放然后暂停然后播放,则不会。我相信这两个问题都是由于您单击 iframe 造成的,因此该事件要么同时触发,要么因为无法在此处捕获事件而无法触发。我认为使用通过 iframe 发送的 postMessages 以及回调可以完成这项工作,但可惜我无法弄清楚这一点。

4

1 回答 1

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");
  };
});

这些可以在之前链接的 codepen 示例中确认和测试:

优酷:http : //codepen.io/earlonrails/pen/jugAm

Vimeo:http ://codepen.io/earlonrails/pen/KBAmd

我猜在 iframe 中单击时的窗口会在 iframe 窗口上设置 onblur ,然后将永远不会被调用,但我仍然无法解释为什么当您单击 iframe 上的播放时,然后单击页面的正文,然后单击不同的选项卡,然后它的工作原理。回调可能不止一次从 iframe 被触发,或者 postMessage 被触发或仍在某个缓冲区中。

于 2014-09-29T20:40:39.053 回答