社内案件で、YouTube APIを使ったWebアプリを作ってるんだけど、
そのときにハマッたのでメモ。以下は失敗した例。
// 前提として、prototype.jsを使ってる
var Player = Class.create({
player: '',
create_player: function(video_id){
var params = {allowScritpAccess: "always"};
var atts = {id: "myytplayer"};
swfobject.embedSWF("http://www.youtube.com/v/"+ video_id +"&enablejsapi=1&playerapiid=ytplayer&autoplay=1&rel=0&showsearch=0&showinfo=0", "ytapi_player", "460", "382", "8", null, null, params, atts);
this.player = $("myytplayer");
this.player.addEventListener("onStateChange", "player_check_state", false);
}
});
function player_check_state(new_state){
// 状態がかわったときの処理なんだけど、まったく呼ばれる気配なし…
}
var Test_Player = new Player();
原因は、swfobject.embedSWFメソッドを呼んですぐにプレイヤーをplayerメンバ変数に代入していたから。これだと、まだプレイヤーが生成されていなくて、エラーを引き起こしてしまう。
// 修正版
var Player = Class.create({
player: '',
create_player: function(video_id){
var params = {allowScritpAccess: "always"};
var atts = {id: "myytplayer"};
swfobject.embedSWF("http://www.youtube.com/v/"+ video_id +"&enablejsapi=1&playerapiid=ytplayer&autoplay=1&rel=0&showsearch=0&showinfo=0", "ytapi_player", "460", "382", "8", null, null, params, atts);
}
});
// プレイヤーの準備が出来たら呼ばれるコールバック関数
function onYouTubePlayerReady(playerId){
Test_Player.player = $("myytplayer");
Test_Player.player.addEventListener("onStateChange", "player_check_state", false);
}
function player_check_state(new_state){
// 状態がかわったときの処理
// 呼ばれた
}
var Test_Player = new Player();
ちゃんと、プレイヤーの領域上にプレイヤーの準備が出来てからでないと、
イベントが設定できないので要注意ですな。
