2012-02-15 12 views
6

Ho un codice di incorporamento di YouTube (incollerò solo il codice che causa il problema per me e taglia cose che non sono pubbliche):API iframe di YouTube player: playVideo non funziona su Firefox 9.0.1

console.log(ytplayer); 
ytplayer.playVideo(); 

Console.log su Chrome e su FF mi mostra buoni oggetti con i metodi corretti, e il metodo playVideo() esiste lì. E funziona per tutti gli altri browser che ho controllato, ma non funziona su FF !? Ciò che è ancora più interessante è che quando riproduco video utilizzando il normale pulsante di riproduzione di YouTube, posso utilizzare il metodo pauseVideo() e tutti gli altri: cercare, controllare il volume, ma non posso usare il metodo playVideo() ...

io uso nuovo modo di video di embedding:

ytplayer = new YT.Player(player, { 
     height: height, 
     width: width, 
     videoId: videoid, 
     allowfullscreen: 'true', 
     playerVars: { 
      controls: 0, 
      showinfo: 0, 
      wmode: 'opaque', 
      autoplay: (autoplay ? 1 : 0) 
     }, 
     events: { 
      'onReady': function() { 
       console.log('I am ready'); 
      } 
     } 
    }); 

Naturalmente 'sono pronto' è in uscita della console. Non ho idea di cosa faccio di sbagliato e perché solo FF non funziona ... Non c'è nessun errore JS, e nessun indizio ... Spero che qualcuno abbia avuto questo problema prima e lo abbia risolto! :)

+0

'Non c'è nessun errore JS e nessun indizio 'solo il collegamento alla pagina del problema potrebbe aiutare gli altri a identificare il problema, non solo le parole. – Cheery

+1

Forse hai ragione @Cheery, ma non posso postarti link perché il progetto su cui sto lavorando è commerciale e deve essere privato fino al rilascio ... scusa! Con "Non c'è nessun errore JS e nessun indizio", voglio dire, che tutto nell'output della console è lo stesso per entrambi: Chrome e FF, e per FF non funziona. Inoltre non ci sono errori e avvertenze. – Karol

+0

'Inoltre non ci sono errori e avvertimenti. E inoltre richiede" esperimenti "e non" pensieri teorici ". – Cheery

risposta

9

Stavo avendo un problema molto simile e stava lottando con una risposta. Le mie chiamate a playVideo() non sembra funzionare.

ORIGINALE:

$('#play_movie').click(function(){ 
    $('#video').show(); 
    if(player) 
    { 
     if(typeof player.playVideo == 'function') 
     { 
      player.playVideo(); 
     } 
    } 

Il problema era che il giocatore non era ancora disponibile - se ho solo dato un po 'di tempo per presentarsi, poi la chiamata ha lavorato

$('#play_movie').click(function(){ 
    $('#video').show(); 
    if(player) 
    { 
     var fn = function(){ player.playVideo(); } 
     setTimeout(fn, 1000); 
    } 

Don' so se questo è il tuo problema esatto, ma spero che aiuti qualcuno

+0

Può essere una soluzione per alcuni casi. – Karol

+3

C'è un evento 'onReady' che viene attivato dal player, non da 'onYouTubeIframeAPIReady', è possibile utilizzarlo, sembra più corretto. –

+0

Il metodo 'playVideo()' funzionava per me in Chrome, ma non funzionava con FF e IE. IE ha segnalato un errore che l'oggetto non supportava il metodo. Una volta aggiunto il timeout, ha funzionato come un incantesimo. Grazie! – gtr1971

7

Un modo più robusto per farlo è quello di verificare se il giocatore è pronto. Se il giocatore non è pronto, metti player.playVideo() ed eseguilo quando è pronto utilizzando l'evento onReady. Gist

var playerConfig = {},     // Define the player config here 
    queue = {       // To queue a function and invoke when player is ready 
     content: null, 
     push: function(fn) { 
     this.content = fn; 
     }, 
     pop: function() { 
     this.content.call(); 
     this.content = null; 
     } 
    }, 
    player; 

window.onYouTubeIframeAPIReady = function() { 
    player = new YT.Player('player', { 
    videoId: 'player', 
    playerVars: playerConfig, 
    events: { 
     onReady: onPlayerReady 
    } 
    }); 
}; 

// API event: when the player is ready, call the function in the queue 
function onPlayerReady() { 
    if (queue.content) queue.pop(); 
} 

// Helper function to check if the player is ready 
function isPlayerReady(player) { 
    return player && typeof player.playVideo === 'function'; 
} 

// Instead of calling player.playVideo() directly, 
// using this function to play the video. 
// If the player is not ready, queue player.playVideo() and invoke it when the player is ready 
function playVideo(player) { 
    isPlayerReady(player) ? player.playVideo() : queue.push(function() { 
               player.playVideo(); 
              }); 
} 
+0

Anche questo approccio mi piace. Mai pensato in questo modo: pulito e robusto come hai detto tu. – Karol

+0

Dovrebbe essere accettata risposta! Se dovessi lamentarmi della tua semantica, direi che la tua coda non è davvero una coda (confusione con il push/pop), ma quello che stai facendo è davvero abbastanza buono. –

1

Mi sono imbattuto in questo post cercando qualcosa di simile. Ho trovato la mia risposta qui, per relic180:

YouTube API - Firefox/IE return error "X is not a function" for any 'player.' request

In sostanza, Chrome può inizializzare youtube ingloba anche quando le div sono nascosti (cioè display:none), ma FF e IE non ci riesco. La mia soluzione era una variante della relic180 di:

sposto il mio giocatore di left:200% o qualsiasi altra cosa quando lo voglio invisibile ma sempre inizializzato (e disponibile per altre chiamate verso player), quindi spostarlo di nuovo sullo schermo quando ne ho bisogno.

0

Personalmente ho trovato su IFram preimpostati, che l'API non funzionerà correttamente se non si userebbe il dominio https://www.youtube.com. Quindi fai attenzione a non perdere il "www". In caso contrario, l'API creerà l'oggetto giocatore ma non riuscirà a eseguire i metodi.

Problemi correlati