我目前正在尝试将 YouTube API 用作 jQuery 插件的一部分,但遇到了一些问题。
YT api 的工作方式是加载 Flash 播放器,当它准备好时,它会向名为onYouTubePlayerReady(playerId)
. 然后,您可以使用该 id 结合getElementById(playerId)
将 javascript 调用发送到 Flash 播放器(即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="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>
您将看到 console.log() 输出有关状态更改的信息,但是,就像我说的,我不知道如何判断它与哪个玩家相关联。
有人对解决此问题有任何想法吗?
编辑:对不起,我还应该提到我已经尝试将事件调用包装在闭包中。
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
永远不会被调用。这更令人沮丧。