Próbuję obecnie korzystać z interfejsu API YouTube jako części wtyczki jQuery i mam do czynienia z pewnym problemem.Używanie javascript API Youtube z jQuery
Sposób działania apletu YT polega na tym, że ładujesz odtwarzacz flash i, gdy będzie gotowy, wyśle połączenie do globalnej funkcji o nazwie onYouTubePlayerReady(playerId)
. Następnie możesz użyć tego identyfikatora w połączeniu z getElementById(playerId)
do wysyłania wywołań javascript do Flash Playera (np. player.playVideo();
).
Możesz dołączyć detektor zdarzeń do odtwarzacza z player.addEventListener('onStateChange', 'playerState');
, który wyśle wszelkie zmiany stanu do innej funkcji globalnej (w tym przypadku playerState
).
Problem polega na tym, że nie jestem pewien, jak powiązać zmianę stanu z konkretnym graczem. Moja wtyczka jQuery może z powodzeniem dołączać więcej niż jeden film do selektora i dołączać zdarzenia do każdego z nich, ale w momencie, w którym stan rzeczywiście się zmienia, tracę informację o tym, który z graczy się wydarzył.
Mam nadzieję, że przykładowy kod może spowodować rzeczy nieco jaśniejsze. Poniższy kod powinien działać poprawnie w dowolnym pliku 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>
Zobaczysz console.log() outputtin informacji o zmianach stanu, ale, jak już mówiłem, nie wiem jak to powiedzieć, który z graczy jest to związane z.
Ktoś ma jakieś przemyślenia na ten temat?
EDIT: Niestety, muszę również wspomnieć, że próbowałem owijania wywołanie zdarzenia w zamknięciu. W takim przypadku playerState
nigdy nie zostanie wywołana. Co jest ekstra frustrujące.
To była moja pierwsza myśl też, ale faktycznie nie działa tutaj. playerState nie wydaje się nigdy być wywoływany. – Steerpike
Przetestowałem Twój kod i opublikowałem go w serwisie YouTube. PlayerReady nigdy nie jest nazywane – Greg
Filmy grają OK, ale – Greg