16

ドキュメントの準備ができている div に YouTube iframe を挿入し、クリックするようにバインドします。

jQuery(document).ready(function($) {
    jQuery('.video-thumb').click(function(){
        ...
        $('#player').html('<iframe width="761" height="421" src="http://www.youtube.com/embed/' + $(this).attr('videoid') + '?rel=0&wmode=transparent" frameborder="0" allowfullscreen></iframe>');
        ...
    }
 }

そして、ビデオが終了したときにコールバックを行いたいです。onYouTubePlayerAPIReadyについて読みましたが、ドキュメントの準備ができていない状態にする必要があります。

ドキュメントの準備ができていないこの構造によって、ビデオプレーヤーをロードしようとしました:

var player;
function onYouTubePlayerAPIReady() {
    player = new YT.Player('player', {
      height: '421',
      width: '761',
      videoId: '',
      playerVars: { autoplay: 1, autohide: 1, showinfo: 0 },
      events: {
        'onReady': onPlayerReady,
        'onStateChange': onPlayerStateChange
      }
    });
}

しかし、私はいくつかの問題を抱えています:

  • showinfo:0 は機能しませんでしたが、最終的に他のビデオのサムネイルが表示されました
  • ビデオIDを変更する方法がわかりません(そしてビデオを再起動しますか?)
  • 最初の方法よりも多くのスクリプト エラー (iframe の挿入)

最初の方法を使用することを好みますが、ビデオ終了コールバックを作成するにはどうすればよいですか? ありがとう。

4

1 に答える 1

29

以下のコードの実例もjsfiddle.netにあります。

いくつかのメモ:

  • javascript_apiではなくiframe_apiを使用します
  • YT.Player コンストラクターは、自分で iframe を構築しているため最小限です。
  • 「playerVars」は、iframe URL パラメーターとして含まれています。
  • パラメータ「enablejsapi=1」が設定されています。

マークアップの例

<script src="http://www.youtube.com/iframe_api"></script>

<a style="display: block;" class="video-thumb" id="HuGbuEv_3AU" href="#">
    Megadeth: Back In The Day
</a>  
<a style="display: block;" class="video-thumb" id="jac80JB04NQ" href="#">
    Judas Priest: Metal Gods
</a> 
<a style="display: block;" class="video-thumb" id="_r0n9Dv6XnY" href="#">
    Baltimora: Tarzan Boy
</a>   

<div id="container"></div>
<div id="log">--Logging enabled--</div>

JavaScript

function log(msg) {
    jQuery('#log').prepend(msg + '<br/>');
}

function onPlayerStateChange(event) {
    switch(event.data) {
        case YT.PlayerState.ENDED:
            log('Video has ended.');
            break;
        case YT.PlayerState.PLAYING:
            log('Video is playing.');
            break;
        case YT.PlayerState.PAUSED:
            log('Video is paused.');
            break;
        case YT.PlayerState.BUFFERING:
            log('Video is buffering.');
            break;
        case YT.PlayerState.CUED:
            log('Video is cued.');
            break;
        default:
            log('Unrecognized state.');
            break;
    }
}

jQuery(document).ready(function($) {
    $('.video-thumb').click(function() {

        var vidId = $(this).attr('id');
        $('#container').html('<iframe id="player_'+vidId+
            '" width="420" height="315" src="http://www.youtube.com/embed/'+
            vidId+'?enablejsapi=1&autoplay=1&autohide=1&showinfo=0" '+
            'frameborder="0" allowfullscreen></iframe>');

        new YT.Player('player_'+vidId, {
            events: {
                'onStateChange': onPlayerStateChange
            }
        });
    });
});
于 2012-09-06T03:26:27.580 に答える