Quero controlar os players do YouTube baseados em iframe. Esses players já estarão no HTML, mas quero controlá-los por meio da API JavaScript.
Li a documentação da API iframe, que explica como adicionar um novo vídeo à página com a API e controlá-lo com as funções do player do YouTube:
var player;
function onYouTubePlayerAPIReady() {
player = new YT.Player('container', {
height: '390',
width: '640',
videoId: 'u1zgFlCw8Aw',
events: {
'onReady': onPlayerReady,
'onStateChange': onPlayerStateChange
}
});
}
Esse código cria um novo objeto player e o atribui a 'player', depois o insere dentro da div #container. Então eu posso operar em 'jogador' e chamada playVideo()
, pauseVideo()
etc. sobre ele.
Mas eu quero poder operar com players de iframe que já estão na página.
Eu poderia fazer isso muito facilmente com o antigo método de incorporação, com algo como:
player = getElementById('whateverID');
player.playVideo();
Mas isso não funciona com os novos iframes. Como posso atribuir um objeto iframe já na página e depois usar as funções da API?
fonte
Respostas:
Fiddle Links: Código fonte - Visualização - Versão pequena
Atualização: Esta pequena função executa apenas o código em uma única direção. Se você deseja suporte total (por exemplo, ouvintes / receptores de eventos), dê uma olhada em Listening for Youtube Event no jQuery
Como resultado de uma análise profunda do código, criei uma função:
function callPlayer
solicita uma chamada de função em qualquer vídeo do YouTube emoldurado. Consulte a referência da API do YouTube para obter uma lista completa das possíveis chamadas de função. Leia os comentários no código fonte para obter uma explicação.Em 17 de maio de 2012, o tamanho do código foi dobrado para cuidar do estado de prontidão do jogador. Se você precisar de uma função compacta que não lide com o estado pronto do player, consulte http://jsfiddle.net/8R5y6/ .
Uso:
Possíveis perguntas (e respostas):
Q : Não funciona!
R : "Não funciona" não é uma descrição clara. Você recebe alguma mensagem de erro? Por favor, mostre o código relevante.
Q :
playVideo
não reproduz o vídeo.R : A reprodução requer interação do usuário e presença
allow="autoplay"
no iframe. Consulte https://developers.google.com/web/updates/2017/09/autoplay-policy-changes e https://developer.mozilla.org/en-US/docs/Web/Media/Autoplay_guideP : Incorporei um vídeo do YouTube usando,
<iframe src="http://www.youtube.com/embed/As2rZGPGKDY" />
mas a função não executa nenhuma função!A : Você tem que adicionar
?enablejsapi=1
no final do seu URL:/embed/vid_id?enablejsapi=1
.P : Recebo a mensagem de erro "Uma cadeia inválida ou ilegal foi especificada". Por quê?
R : A API não funciona corretamente em um host local (
file://
). Hospede sua página (teste) online ou use o JSFiddle . Exemplos: Veja os links na parte superior desta resposta.Q : Como você sabia disso?
R : Passei algum tempo interpretando manualmente a fonte da API. Concluí que tinha que usar o
postMessage
método. Para saber quais argumentos passar, criei uma extensão do Chrome que intercepta mensagens. O código fonte da extensão pode ser baixado aqui .P : Quais navegadores são suportados?
R : Todo navegador que suporta JSON e
postMessage
.document.readyState
foi implementado na 3.6)Resposta / implementação relacionada: Incorporação gradual de um vídeo emoldurado usando o jQuery
Suporte completo à API: Ouvindo eventos do YouTube na jQuery
Official API: https://developers.google.com/youtube/iframe_api_reference
Histórico de Revisão
Implementado
onYouTubePlayerReady
:callPlayer('frame_id', function() { ... })
.As funções são colocadas na fila automaticamente quando o player ainda não está pronto.
Atualizado e testado com êxito nos navegadores suportados (veja a frente).
callPlayer
força uma verificação de prontidão. Isso é necessário, porque quandocallPlayer
é chamado logo após a inserção do iframe enquanto o documento está pronto, ele não pode ter certeza de que o iframe está totalmente pronto. No Internet Explorer e Firefox, esse cenário resultou em uma chamada muito precoce depostMessage
, o que foi ignorado.&origin=*
a URL.&origin=*
para o URL.fonte
PostMessage
método é baseado na API YT JS (?enablejsapi=1
). Sem ativar a API JS, opostMessage
método não fará nada. Consulte a resposta vinculada para uma fácil implementação de listeners de eventos. Também criei, mas não publiquei, código legível para se comunicar com o quadro. Decidi não publicá-lo, porque seu efeito é semelhante à API de quadros padrão do YouTube.playVideo
, por isso recomendo usar a API oficial para isso. Consulte developers.google.com/youtube/iframe_api_reference#Events .Parece que o YouTube atualizou a API JS para que esteja disponível por padrão! Você pode usar o ID de iframe do YouTube existente ...
... no seu JS ...
... e o construtor usará o iframe existente em vez de substituí-lo por um novo. Isso também significa que você não precisa especificar o videoId para o construtor.
Consulte Carregando um player de vídeo
fonte
event
oucommand
enviar ao iframe do YT para pararlistening
no status?Você pode fazer isso com muito menos código:
Exemplo de trabalho: http://jsfiddle.net/kmturley/g6P5H/296/
fonte
Minha própria versão do código de Kim T acima, que combina com alguns jQuery e permite o direcionamento de iframes específicos.
fonte
OnStateChange
: developers.google.com/youtube/iframe_api_reference#EventsObrigado Rob W pela sua resposta.
Eu tenho usado isso em um aplicativo Cordova para evitar ter que carregar a API e para que eu possa controlar facilmente iframes carregados dinamicamente.
Eu sempre quis poder extrair informações do iframe, como o estado (getPlayerState) e a hora (getCurrentTime).
Rob W ajudou a destacar como a API funciona usando o postMessage, mas é claro que isso só envia informações em uma direção, da nossa página da web para o iframe. O acesso aos getters requer que escutemos as mensagens enviadas de volta a partir do iframe.
Levei algum tempo para descobrir como ajustar a resposta de Rob W para ativar e ouvir as mensagens retornadas pelo iframe. Basicamente, pesquisei o código-fonte no iframe do YouTube até encontrar o código responsável pelo envio e recebimento de mensagens.
A chave foi mudar o 'evento' para 'ouvir', isso basicamente deu acesso a todos os métodos que foram projetados para retornar valores.
Abaixo está a minha solução, observe que eu mudei para 'ouvindo' apenas quando getters são solicitados; você pode ajustar a condição para incluir métodos extras.
Observe ainda que você pode visualizar todas as mensagens enviadas do iframe adicionando um console.log (e) à janela window.onmessage. Você notará que uma vez ativada a audição, você receberá atualizações constantes que incluem a hora atual do vídeo. Chamadores de getters como o getPlayerState ativarão essas atualizações constantes, mas enviarão apenas uma mensagem envolvendo o estado do vídeo quando o estado for alterado.
fonte