Youtube api onYouTubeIframeAPIReady()未触发

Youtube api onYouTubeIframeAPIReady()未触发,youtube-api,youtube-iframe-api,Youtube Api,Youtube Iframe Api,我已经浏览了很多问题和youtube api的内容,但我一辈子都不明白为什么OnyoutubeiFrameAPReady不起作用 这是我的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" frame

我已经浏览了很多问题和youtube api的内容,但我一辈子都不明白为什么OnyoutubeiFrameAPReady不起作用

这是我的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>

我为加载的脚本获取了console.log,但没有为Iframe ready或其他任何内容获取。有什么想法吗?谢谢

回调函数必须在全局范围内。只需移动
onyoutubeiframeapiredy
callYTapi
之外的其他人就可以了。幸运的是,在对控制台进行了大量实验之后,我得到了一些具体的东西。直到一天前,我还遇到了同样的问题,当我在单例范围内时,我就知道该怎么做了

下面是我的代码的样子:

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();

要明确的是,上述公认的答案对我来说似乎是这样的:

加载API(来自yt文档)

在窗口上指定YouTube的内置就绪函数“onYouTubeIframeAPIReady”

window.onYouTubeIframeAPIReady = this.onYTready;
因此,
this.onYTready
是我的函数名,位于其他位置。 我可以确认我的
onYTready
函数可以在Chrome中控制台日志/调试器断点

(编辑)您可能希望将其绑定到函数,例如:

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

或者“这”将用于窗口,而不是您可能正在使用的特定视图。

是的,我刚刚意识到!谢谢Vincius!我在那个函数中需要它,所以我改为window.onYouTubeIframeAPIReady()=函数(){},一切都很好…以防有人怀疑。我也遇到了类似的问题。由于某种原因,封面图片没有加载。我将API包装在函数窗口中。onYouTubeIframeAPIReady()=函数(){},它可以工作。谢谢在第二次访问同一个视频id时,我无法通过播放器对象获取视频url。如果有人仍然想知道-onYouTubeIframeAPIReady()函数必须全局定义,请进一步澄清。只需将“function onyoutubeiframeapiredy(){….”替换为“window.onyoutubeiframeapiredy=function(){….”就可以了。这正是我的问题和快速解决方案。谢谢。另外,由于一些奇怪的原因,我在控制台上遇到了一个错误。在Chrome上:“uncaughttypeerror:undefined不是一个函数”。到处玩并插入setTimeout(函数(){},1)在一些地方,MeWork为我使用了<>代码> StimeTimeOut/<代码>可能会重复解释你的答案,然后帮助编解码器解释为什么你挖掘这个3岁的问题。这个解决方案帮助我在WBACKAY页面生成器上播放视频,用于背景行。将
onYouTubeIframeReady
事件签名到
window
是我在将YouTube API与webpack集成时寻找的解决方案。
function playIframeVideo(iframe) {
    iframe.videoPlay = true; //init state
    iframe.contentWindow.postMessage('{"event":"command","func":"playVideo","args":""}', '*');
}

function pauseIframeVideo(iframe) {
    iframe.videoPlay = false; //init state
    iframe.contentWindow.postMessage('{"event":"command","func":"pauseVideo","args":""}', '*');
}

$('.vc_video-bg-container').on('click', function () {

    var iframe = $('iframe').get(0); //iframe tag

    if (iframe.videoPlay != true) {
        playIframeVideo(iframe);
    } else {
        pauseIframeVideo(iframe);
    }
});
window.onYouTubeIframeAPIReady = this.onYTready.bind(this);
function playIframeVideo(iframe) {
    iframe.videoPlay = true; //init state
    iframe.contentWindow.postMessage('{"event":"command","func":"playVideo","args":""}', '*');
}

function pauseIframeVideo(iframe) {
    iframe.videoPlay = false; //init state
    iframe.contentWindow.postMessage('{"event":"command","func":"pauseVideo","args":""}', '*');
}

$('.vc_video-bg-container').on('click', function () {

    var iframe = $('iframe').get(0); //iframe tag

    if (iframe.videoPlay != true) {
        playIframeVideo(iframe);
    } else {
        pauseIframeVideo(iframe);
    }
});