2011-06-30 121 views
23

我尝试使用froogaloop API识别vimeo的onPlay,onPause和onFinish事件。我尝试了所有我能想到的东西,但没有运气。Vimeo Froogaloop API无法识别事件

我得到火狐此错误:

Permission denied for <code><http://player.vimeo.com></code> to get pet property Location.toString

中和铬:

Unsafe javascript attempt to access frame with URL ... from frame with URL `http://player.vimeo.com/video/3718294?api=1. Domains, protocols and ports must match.

导入从CDN froogaloop:

<script src="http://a.vimeocdn.com/js/froogaloop2.min.js"></script> 

我的JS:

$(function(){ 

    var vimeoPlayer = document.querySelector('iframe'); 

    $f(vimeoPlayer).addEvent('ready', ready); 

    function ready(player_id) { 

     froogaloop = $f(player_id); 

     function setupEventListeners() { 
      function onPlay() { 
       froogaloop.addEvent('play', 
       function(data) { 
        console.log('play event'); 
       }); 
      } 

      function onPause() { 

       froogaloop.addEvent('pause', 
       function(data) { 
        console.log('pause event'); 
       }); 
      } 

      function onFinish() { 
       froogaloop.addEvent('finish', 
       function(data) { 
        console.log('finish'); 
       }); 
      } 
      onPlay(); 
      onPause(); 
      onFinish(); 
     } 
     setupEventListeners(); 
    } 

}) 

我的HTML:

<iframe src="http://player.vimeo.com/video/3718294?api=1" width="623" height="350" frameborder="0" id="iframe-video"></iframe> 

回答

77

经过数小时和数小时的挫折...我找到了解决方案。

因为我在iframe上使用了一个ID ...显然vimeo API会强制您将参数添加到您要提取的URL(player_id = iframe-id)。

所以内嵌框架应该是这样的:

<iframe src="//player.vimeo.com/video/3718294?api=1&player_id=promo-vid" 
     width="623" height="350" frameborder="0" 
     id="promo-vid"> 
</iframe> 

特别感谢德鲁·贝克指出这一点:http://vimeo.com/forums/topic:38114#comment_5043696

+3

不客气!很高兴我能帮上忙。 –

+5

我做的如何使用Vimeo的API这里一个例子:通过“挫折小时部分http://labs.funkhausdesign.com/examples/vimeo/froogaloop2-api-basics.html –

+0

我还在苦读。当我按照给出的例子给出的是违反JavaScript安全策略的情况。你是如何克服这些的? – RSG

1

我认为你违反了Same Origin Policy。你会注意到在你正在做很多事件处理的地方,他们正在使用特殊的froogaloop API调用。

我从来没有使用froogaloop,所以我可能是错的。但这是我的猜测。这些错误似乎表明iframe正在尝试修改浏览器中的URL,并且现在Same源允许这样做。这就是API为你包装window.postMessage的原因。

+0

我能做些什么来解决这个问题,然后选择第一个元素? – criticerz

+0

坚持更多的模式。例如,看看他们的SimpleButtons示例;他们的evenListener回调函数都是对froogaloop API方法的调用。由于您正在向正在尝试与浏览器交互的froogaloop对象添加事件侦听器,因此您必须通过其API执行此操作。另外,看看他们的API,我没有看到为froogaloop对象定义的“addEvent”,只是一个addEventListener。他们在包装addEventListener的示例代码中定义了自己的addEvent。使我认为使用与Same Origin相关的内置addEvent存在问题。 –

+0

我有一些类似的问题。我的视频默认隐藏。我试图首先显示视频(通过jQuery'''somediv.show();'''),然后直接调用:'''player.api('play');''' 。这将导致非常奇怪的行为,其中视频无法播放,或30秒左右的时间玩...... 最后,我刚刚创建了一个单独的函数(比方说OnPlay),其中只包含:'' 'player.api( '玩');'''。现在这条线变成: '''somediv.show(0,OnPlay)'''; This Works!但为什么? – danger89

0

有过类似的问题,与Froggaloop2 - 看来,如果视频缓存,就绪事件只会触发一次(在初始加载时)。解决的办法是不断变化的SRC检索的iframe,如:

$(iframe).attr('src', $(iframe).attr('src') + '#timestamp='+(new Date()).getTime()); 
2

得到一个错误与jQuery的选择的iframe时产生的播放器元素。

var iframe = $('#player1'); 
var player = $f(iframe); 

结果

TypeError: d[f] is undefined 

解决方案对我来说是jQuery的ID选择

var iframe = $('#player1')[0]; 
var player = $f(iframe); 
+0

你有答案@Max吗? – malhar

+0

选择1. JS对象,它是jQuery选择了[0]背后,作为我的回答底部statet ... –

+0

我用它,但是,我得到同样的错误里面!如果我尝试提醒它,iframe是不确定的。此外,使用Player_id和api = 1, – malhar