【问题标题】:Youtube embed API and external JSYoutube 嵌入 API 和外部 JS
【发布时间】:2016-10-02 09:16:15
【问题描述】:

我已经阅读了 YouTube API 的基础知识,并且它可以毫无问题地在我的网页上运行。但是我希望能够使用视频的状态来触发或停止我在外部 JS 文件中编写的某些功能。非常感谢任何帮助!

目前,我在 iframe 本身之后将以下内容嵌入到我的 HTML 文件中:

var tag = document.createElement('script');
tag.src = "https://www.youtube.com/iframe_api";

var firstScriptTag = document.getElementsByTagName('script')[0];
firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);

var player;
function onYouTubeIframeAPIReady(){
    player = new YT.Player('MyVideoID',{
        events: {
            'onReady': onPlayerReady,
            'onStateChange': onPlayerStateChange
        }
    });
}

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

function onPlayerStateChange(event) {
    if (event.data == YT.PlayerState.PLAYING) {
        var slideTimeMS = 10000; /* This is a variable which exists in my external file which I would like the player state to manipulate
    }
}

上面的代码本身可以正常工作,但正如我之前所说,我想将它移动到外部文件中,例如,我可以在播放视频时暂停轮播等,其功能已经在说JS文件。

谁能告诉我如何才能成功地在另一个文件中访问它?

非常感谢您的帮助!

标记

【问题讨论】:

    标签: javascript jquery html youtube


    【解决方案1】:

    对于任何这可能会有所帮助的人,这是我最终找到的解决方案:

    iframe 像往常一样嵌入在 HTML 中,但没有在 HTML 中完成任何 JS。在我的 JS 文件中,我有以下内容:

    var myPlayerState;
    $(function(){
        var yt_int, yt_players={},
            initYT = function() {
                $("IDOrClassOfMyVideo").each(function() {
                    yt_players[this.id] = new YT.Player(this.id,
                    {
                        events: {
                            'onReady' : onPlayerReady,
                            'onStateChange': onPlayerStateChange
                        }
                    });
                });
            };
    
        $.getScript("//www.youtube.com/player_api", function() {
            yt_int = setInterval(function(){
                if(typeof YT === "object"){
                    initYT();
                    clearInterval(yt_int);
                }
            },500);
        });
    

    那么其余代码中的函数就可以正常工作了!

    【讨论】:

    • 在这么多网站上使用 YT Embed API 时遇到了很多麻烦,因为我想将功能与 DOM 分开。这是跨站点的最佳解决方案。谢谢!
    【解决方案2】:

    这里有几个选项:

    1. 将代码移动到与其他 JS 函数相同的文件中。
    2. 将代码移动到其自己的文件中,并在包含其他 JS 函数的文件之后使用 脚本标签将其导入。
    3. 使用像requirejs这样的JS文件/模块加载器

    【讨论】:

    • 你好,arizzle。非常感谢您的建议。我对选项 1 的问题(当然,这是我的首选选项)是它似乎不起作用。如果我解除上面的代码并将其放入我的 js 文件中,我不会得到任何结果。我想我遗漏了一些东西,也许是如何在 html 文件中引用 iframe 和 API。
    • 当您尝试这样做时,控制台中是否显示任何错误?如果我能看到整个 js 文件的样子会有所帮助
    【解决方案3】:

    this article 对我很有用

    window.onYouTubeIframeAPIReady = function() {
        window.player = new window.YT.Player(iframeId, {
            ......
        });
    }
    

    【讨论】:

    • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
    猜你喜欢
    • 2010-10-25
    • 2012-08-22
    • 2014-10-30
    • 2012-07-24
    • 1970-01-01
    • 1970-01-01
    • 2023-03-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多