J'essaie actuellement d'utiliser l'API YouTube dans le cadre d'un plugin jQuery et j'ai rencontré un problème. De la façon dont l'API YT fonctionne, vous chargez le lecteur Flash et, quand il est prêt, il renvoie un appel à une fonction globale appelée onYouTubePlayerReady(playerId)
. Vous pouvez ensuite utiliser cet identifiant combiné avec getElementById(playerId)
pour envoyer des appels javascript dans le lecteur flash (par exemple, player.playVideo();
).Utilisation de l'API JavaScript de javascript avec jQuery
Vous pouvez attacher un écouteur d'événement au lecteur avec player.addEventListener('onStateChange', 'playerState');
qui enverra les modifications d'état à une autre fonction globale (dans ce cas, playerState
). Le problème est que je ne suis pas sûr de savoir comment associer un changement d'état à un lecteur spécifique. Mon plugin jQuery peut heureusement attacher plus d'une vidéo à un sélecteur et attacher des événements à chacun, mais au moment où un état change, je perds la trace du joueur dans lequel il s'est produit.
J'espère que quelques exemples de code peuvent faire les choses un peu plus claires. Le code ci-dessous devrait fonctionner correctement dans n'importe quel fichier html.
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="application/text+html;utf-8"/>
<title>Sandbox</title>
<link type="text/css" href="http://jqueryui.com/latest/themes/base/ui.all.css" rel="stylesheet" />
<script type="text/javascript" src="http://www.google.com/jsapi"></script>
<script type="text/javascript">
google.load("jquery", "1.3.2");
google.load("jqueryui", "1.7.0");
</script>
<script type="text/javascript" src="http://swfobject.googlecode.com/svn/tags/rc3/swfobject/src/swfobject.js"></script>
<script type="text/javascript">
(function($) {
$.fn.simplified = function() {
return this.each(function(i) {
var params = { allowScriptAccess: "always" };
var atts = { id: "ytplayer"+i };
$div = $('<div />').attr('id', "containerplayer"+i);
swfobject.embedSWF("http://www.youtube.com/v/QTQfGd3G6dg&enablejsapi=1&playerapiid=ytplayer"+i,
"containerplayer"+i, "425", "356", "8", null, null, params, atts);
$(this).append($div);
});
}
})(jQuery);
function onYouTubePlayerReady(playerId) {
var player = $('#'+playerId)[0];
player.addEventListener('onStateChange', 'playerState');
}
function playerState(state) {
console.log(state);
}
$(document).ready(function() {
$('.secondary').simplified();
});
</script>
</head>
<body>
<div id="container">
<div class="secondary">
</div>
<div class="secondary">
</div>
<div class="secondary">
</div>
<div class="secondary">
</div>
</div>
</body>
</html>
Vous verrez le console.log() outputtin informations sur les changements d'état, mais, comme je l'ai dit, je ne sais pas comment dire quel joueur il est associé.
Quelqu'un a des idées pour contourner cela?
EDIT: Désolé, je devrais également mentionné que j'ai essayé d'encapsuler l'appel d'événement dans une fermeture. Dans cette situation, playerState
ne reçoit jamais d'appel. Ce qui est très frustrant.
Ce fut ma première pensée aussi, mais cela ne fonctionne pas vraiment ici. playerState ne semble jamais être appelé. – Steerpike
J'ai testé votre code comme-posté et onYouTubePlayerReady n'est jamais appelé – Greg
Les vidéos jouent OK si – Greg