21

私は非常に多くの質問とYouTube APIのことを調べてきましたが、私の人生では、onYouTubeIframeAPIReadyが機能しない理由を理解できません。

ここに私のiframeがあります:

<iframe id="youtube_vid" width="763" height="430" src="https://www.youtube.com/embed/dlJshzOv2cw?theme=light&amp;showinfo=0&amp;rel=0&amp;enablejsapi=1" frameborder="0" allowfullscreen=""></iframe>

そして私のスクリプト:

function callYTapi() {

    var tag = document.createElement('script');
    tag.src = "https://www.youtube.com/iframe_api";
    var firstScriptTag = document.getElementsByTagName('script')[0];
    firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);
    console.log('script loaded');

    function onYouTubeIframeAPIReady() {
        console.log('IframeAPI = Ready');
        var player = new YT.Player('youtube_vid', {
            events: {
                'onReady': onPlayerReady,
                'onStateChange': onPlayerStateChange
            }
        });
    }

    function onPlayerReady(event) {
        event.target.playVideo();
    }

    function onPlayerStateChange(event) {
        if (event.data == YT.PlayerState.PAUSED) {
            console.log("Paused");
        }

        if (event.data == YT.PlayerState.PLAYING) {
            console.log("Playing");
        }

        if (event.data == YT.PlayerState.ENDED) {
            end(); 
        }
    }
}

ロードされたスクリプトの console.log を取得しますが、Iframe の準備が整っているかどうかはわかりません。何か案は?ありがとう

4

4 に答える 4

7

幸いなことに、コンソールで多くの実験を行った後、具体的なものを見つけました。私は前日まで同じ問題を抱えていて、シングルトンのスコープ内にいるときにどうすればよいかを考え出しました。

私のコードは次のようになります。

var XT = XT || {};

window.onYouTubeIframeAPIReady = function(){
    setTimeout(XT.yt.onYouTubeIframeAPIReady,500);
}

XT.yt = {

/* load the YouTube API first */
loadApi: function () {

        var j = document.createElement("script"),
            f = document.getElementsByTagName("script")[0];
        j.src = "//www.youtube.com/iframe_api";
        j.async = true;
        f.parentNode.insertBefore(j, f);
        console.log('API Loaded');
    },

/*default youtube api listener*/
onYouTubeIframeAPIReady: function () {
    console.log('API Ready?');
    window.YT = window.YT || {};
    if (typeof window.YT.Player === 'function') {
        player = new window.YT.Player('player', {
            width: '640',
            height: '390',
            videoId: 'nE6mDCdYuwY',
            events: {
                onStateChange: XT.yt.onPlayerStateChange,
                onError: XT.yt.onPlayerError,
                onReady: setTimeout(XT.yt.onPlayerReady, 4000)
            }
        });
    }
},


onPlayerReady: function() {
    player.playVideo(); /* start the video */
    player.setVolume(1); /* set volume to 1 (accepts 0-100) */
},

onPlayerStateChange: function (e) {
    console.log(e.data, YT.PlayerState.PLAYING, e.data === YT.PlayerState.PLAYING);
    var video_data = e.target.getVideoData();

    //do something on video ends
    if(e.data === YT.PlayerState.ENDED)
    this.onPlayerStop();
},

onPlayerStop: function(){
    //console.log('video ended');
},

onPlayerError: function (e) {
    console.log( "youtube: " + e.target.src + " - " + e.data);
},

init: function () {
    this.loadApi();
}

}

XT.yt.init();
于 2015-01-02T21:34:59.530 に答える
6

明確にするために、上記の受け入れられた回答は、次のように機能するようです。

API を読み込む (yt のドキュメントから)

var tag = document.createElement('script');

tag.src = "https://www.youtube.com/iframe_api";
var firstScriptTag = document.getElementsByTagName('script')[0];
firstScriptTag.parentNode.insertBefore(tag, firstScriptTag); 

ウィンドウにYouTubeの組み込みレディ関数「onYouTubeIframeAPIReady」を指定する

window.onYouTubeIframeAPIReady = this.onYTready;

this.onYTready私の関数名もそうで、他の場所にあります。onYTready関数が Chrome のログ/デバッガー ブレークポイントをコンソールできることを確認できます。

(編集)これを関数にバインドしたい場合があります。例:

window.onYouTubeIframeAPIReady = this.onYTready.bind(this);

または、「this」は、使用している特定のビューではなく、ウィンドウ用になります..

于 2016-06-10T19:00:09.380 に答える