2011-06-30 167 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