В настоящее время я пытаюсь использовать YouTube API как часть плагина jQuery, и я столкнулся с некоторой проблемой.
Как работает YT api, вы загружаете Flash-плеер, и когда он будет готов, он отправит вызов глобальной функции с именем onYouTubePlayerReady(playerId)
. Затем вы можете использовать этот идентификатор в сочетании с getElementById(playerId)
для отправки вызовов javascript в флеш-плеер (т.е. player.playVideo();
).
Вы можете присоединить прослушиватель событий к плееру с помощью player.addEventListener('onStateChange', 'playerState');
, который отправит любые изменения состояния в другую глобальную функцию (в данном случае playerState
).
Проблема заключается в том, что я не уверен, как связать изменение состояния с конкретным игроком. Мой плагин jQuery может с радостью подключить несколько видео к селектору и присоединить события к каждому из них, но в тот момент, когда состояние действительно меняется, я теряю информацию о том, в каком проигрывателе он произошел.
Я надеюсь, что какой-то примерный код может сделать вещи немного яснее. Следующий код должен хорошо работать в любом 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="#" onclick="location.href='http://jqueryui.com/latest/themes/base/ui.all.css'; return false;" 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>
Вы увидите информацию о состоянии state.log() outputtin на изменениях состояния, но, как я уже сказал, я не знаю, как определить, с каким игроком он связан.
У кого-нибудь есть мысли об этом?
EDIT: К сожалению, я должен был также упомянуть, что я попытался завернуть вызов события в закрытии.
function onYouTubePlayerReady(playerId) {
var player = $('#'+playerId)[0];
player.addEventListener('onStateChange', function(state) {
return playerState(state, playerId, player); } );
}
function playerState(state, playerId, player) {
console.log(state);
console.log(playerId);
}
В этой ситуации playerState
никогда не вызывается. Это лишнее разочарование.