Je souhaite pouvoir contrôler les lecteurs YouTube basés sur iframe. Ces lecteurs seront déjà dans le HTML, mais je souhaite les contrôler via l'API JavaScript.
J'ai lu la documentation de l'API iframe qui explique comment ajouter une nouvelle vidéo à la page avec l'API, puis la contrôler avec les fonctions du lecteur YouTube:
var player;
function onYouTubePlayerAPIReady() {
player = new YT.Player('container', {
height: '390',
width: '640',
videoId: 'u1zgFlCw8Aw',
events: {
'onReady': onPlayerReady,
'onStateChange': onPlayerStateChange
}
});
}
Ce code crée un nouvel objet player et l'assigne à 'player', puis l'insère dans le #container div. Ensuite , je peux fonctionner sur « lecteur » et appel playVideo()
, pauseVideo()
etc. sur elle.
Mais je veux pouvoir opérer sur des lecteurs iframe qui sont déjà sur la page.
Je pourrais le faire très facilement avec l'ancienne méthode d'intégration, avec quelque chose comme:
player = getElementById('whateverID');
player.playVideo();
Mais cela ne fonctionne pas avec les nouveaux iframes. Comment puis-je attribuer un objet iframe déjà sur la page, puis utiliser les fonctions API dessus?
la source
Réponses:
Liens Fiddle: Code source - Aperçu - Petite version
Mise à jour: Cette petite fonction n'exécutera du code que dans un seul sens. Si vous voulez une prise en charge complète (par exemple, les écouteurs / getters d'événements), jetez un œil à Listening for Youtube Event dans jQuery
À la suite d'une analyse approfondie du code, j'ai créé une fonction:
function callPlayer
demande un appel de fonction sur n'importe quelle vidéo YouTube encadrée. Consultez la référence YouTube Api pour obtenir une liste complète des appels de fonction possibles. Lisez les commentaires sur le code source pour une explication.Le 17 mai 2012, la taille du code a été doublée afin de prendre en charge l'état prêt du joueur. Si vous avez besoin d'une fonction compacte qui ne traite pas l'état prêt du lecteur, consultez http://jsfiddle.net/8R5y6/ .
Usage:
Questions (et réponses) possibles:
Q : Cela ne fonctionne pas!
R : «Ne fonctionne pas» n'est pas une description claire. Recevez-vous des messages d'erreur? Veuillez montrer le code correspondant.
Q :
playVideo
ne lit pas la vidéo.R : La lecture nécessite une interaction de l'utilisateur et la présence de
allow="autoplay"
sur l'iframe. Voir https://developers.google.com/web/updates/2017/09/autoplay-policy-changes et https://developer.mozilla.org/en-US/docs/Web/Media/Autoplay_guideQ : J'ai intégré une vidéo YouTube en utilisant
<iframe src="http://www.youtube.com/embed/As2rZGPGKDY" />
mais la fonction n'exécute aucune fonction!A : Vous devez ajouter
?enablejsapi=1
à la fin de votre URL:/embed/vid_id?enablejsapi=1
.Q : J'obtiens le message d'erreur "Une chaîne non valide ou illégale a été spécifiée". Pourquoi?
R : L'API ne fonctionne pas correctement sur un hôte local (
file://
). Hébergez votre page (de test) en ligne ou utilisez JSFiddle . Exemples: voir les liens en haut de cette réponse.Q : Comment le saviez-vous?
R : J'ai passé un certain temps à interpréter manuellement la source de l'API. J'ai conclu que je devais utiliser le
postMessage
méthode. Pour savoir quels arguments passer, j'ai créé une extension Chrome qui intercepte les messages. Le code source de l'extension peut être téléchargé ici .Q : Quels navigateurs sont pris en charge?
R : Tous les navigateurs prenant en charge JSON et
postMessage
.document.readyState
été implémenté dans 3.6)Réponse / implémentation associée: Fade-in a frame video using jQuery
Full API support: Listening for Youtube Event in jQuery
Official API: https://developers.google.com/youtube/iframe_api_reference
Historique des révisions
Mise en œuvre
onYouTubePlayerReady
:callPlayer('frame_id', function() { ... })
.Les fonctions sont automatiquement mises en file d'attente lorsque le lecteur n'est pas encore prêt.
Mis à jour et testé avec succès dans les navigateurs pris en charge (à venir).
callPlayer
force un contrôle de disponibilité. Cela est nécessaire, car quandcallPlayer
est appelé juste après l'insertion de l'iframe alors que le document est prêt, il ne peut pas savoir avec certitude que l'iframe est entièrement prêt. Dans Internet Explorer et Firefox, ce scénario a entraîné une invocation trop précoce depostMessage
, qui a été ignoré.&origin=*
l'URL.&origin=*
de la recommandation de suppression de l'URL.la source
PostMessage
méthode est basée sur l'API YT JS (?enablejsapi=1
). Sans activer l'API JS, lapostMessage
méthode ne fera rien, voir la réponse liée pour une implémentation facile des écouteurs d'événements. J'ai également créé, mais pas publié, du code lisible pour communiquer avec le cadre. J'ai décidé de ne pas le publier, car son effet est similaire à l'API YouTube Frame par défaut.playVideo
, je recommande donc d'utiliser l'API officielle pour cela. Voir developer.google.com/youtube/iframe_api_reference#Events .On dirait que YouTube a mis à jour son API JS, elle est donc disponible par défaut! Vous pouvez utiliser l'identifiant d'un iframe YouTube existant ...
... dans votre JS ...
... et le constructeur utilisera votre iframe existant au lieu de le remplacer par un nouveau. Cela signifie également que vous n'avez pas à spécifier le videoId au constructeur.
Voir Chargement d'un lecteur vidéo
la source
event
oucommand
envoyer à l'iframe YT pour s'arrêterlistening
au statut?Vous pouvez le faire avec beaucoup moins de code:
Exemple de travail: http://jsfiddle.net/kmturley/g6P5H/296/
la source
Ma propre version du code de Kim T ci-dessus qui se combine avec certains jQuery et permet de cibler des iframes spécifiques.
la source
OnStateChange
: developer.google.com/youtube/iframe_api_reference#EventsMerci Rob W pour votre réponse.
J'utilise ceci dans une application Cordova pour éviter d'avoir à charger l'API et pour pouvoir contrôler facilement les iframes qui sont chargées dynamiquement.
J'ai toujours voulu pouvoir extraire des informations de l'iframe, telles que l'état (getPlayerState) et l'heure (getCurrentTime).
Rob W a aidé à mettre en évidence le fonctionnement de l'API à l'aide de postMessage, mais bien sûr, cela n'envoie les informations que dans une seule direction, de notre page Web à l'iframe. Pour accéder aux getters, nous devons écouter les messages qui nous sont renvoyés depuis l'iframe.
Il m'a fallu un certain temps pour comprendre comment modifier la réponse de Rob W pour activer et écouter les messages renvoyés par l'iframe. J'ai essentiellement cherché dans le code source dans l'iframe YouTube jusqu'à ce que je trouve le code responsable de l'envoi et de la réception des messages.
La clé était de changer «l'événement» en «écoute», cela donnait essentiellement accès à toutes les méthodes conçues pour renvoyer des valeurs.
Voici ma solution, veuillez noter que je suis passé à «écouter» uniquement lorsque les getters sont demandés, vous pouvez modifier la condition pour inclure des méthodes supplémentaires.
Notez en outre que vous pouvez afficher tous les messages envoyés depuis l'iframe en ajoutant un console.log (e) à window.onmessage. Vous remarquerez qu'une fois l'écoute activée, vous recevrez des mises à jour constantes qui incluent l'heure actuelle de la vidéo. L'appel de getters tels que getPlayerState activera ces mises à jour constantes, mais n'enverra un message impliquant l'état de la vidéo que lorsque l'état a changé.
la source