使用 JavaScript 或 jQuery 监听 Youtube 事件

2023-11-26

我有一个滑块,其中包含 4 个通过 iframe 嵌入代码嵌入的 YouTube 视频

http://www.youtube.com/embed/'.$i.'?enablejsapi=1

我正在努力使onStateChange四个视频中任何一个的事件调用我调用的函数stopCycle()当视频开始播放时,这将停止滑块。 iframe 没有 id。我不确定如何正确捕获此事件,并且可以使用任何关于我做错了什么的建议。

<script charset="utf-8" type="text/javascript" src="http://www.youtube.com/player_api"></script>

var playerObj = document.getElementById("tab2"); // the container for 1 of the 4 iframes

playerObj.addEventListener("onStateChange", "stopCycle");

function stopCycle(event) {
    alert('Stopped!');
}

The YouTube 框架 API does支持现有框架。为了提高使用率,我创建了一些辅助函数。看看下面的代码+注释和演示:http://jsfiddle.net/YzvXa/197

要将函数绑定到现有框架,您have to将 ID 引用传递给框架。在您的情况下,框架包含在一个容器内id="tab2"。为了更容易实现,我定义了一个自定义函数:

function getFrameID(id){
    var elem = document.getElementById(id);
    if (elem) {
        if(/^iframe$/i.test(elem.tagName)) return id; //Frame, OK
        // else: Look for frame
        var elems = elem.getElementsByTagName("iframe");
        if (!elems.length) return null; //No iframe found, FAILURE
        for (var i=0; i<elems.length; i++) {
           if (/^https?:\/\/(?:www\.)?youtube(?:-nocookie)?\.com(\/|$)/i.test(elems[i].src)) break;
        }
        elem = elems[i]; //The only, or the best iFrame
        if (elem.id) return elem.id; //Existing ID, return it
        // else: Create a new ID
        do { //Keep postfixing `-frame` until the ID is unique
            id += "-frame";
        } while (document.getElementById(id));
        elem.id = id;
        return id;
    }
    // If no element, return null.
    return null;
}

// Define YT_ready function.
var YT_ready = (function() {
    var onReady_funcs = [], api_isReady = false;
    /* @param func function     Function to execute on ready
     * @param func Boolean      If true, all qeued functions are executed
     * @param b_before Boolean  If true, the func will added to the first
                                 position in the queue*/
    return function(func, b_before) {
        if (func === true) {
            api_isReady = true;
            while (onReady_funcs.length) {
                // Removes the first func from the array, and execute func
                onReady_funcs.shift()();
            }
        } else if (typeof func == "function") {
            if (api_isReady) func();
            else onReady_funcs[b_before?"unshift":"push"](func); 
        }
    }
})();
// This function will be called when the API is fully loaded
function onYouTubePlayerAPIReady() {YT_ready(true)}

// Load YouTube Frame API
(function() { // Closure, to not leak to the scope
  var s = document.createElement("script");
  s.src = (location.protocol == 'https:' ? 'https' : 'http') + "://www.youtube.com/player_api";
  var before = document.getElementsByTagName("script")[0];
  before.parentNode.insertBefore(s, before);
})();

//之前定义了核心功能。展望实施:

var player; //Define a player object, to enable later function calls, without
            // having to create a new class instance again.

// Add function to execute when the API is ready
YT_ready(function(){
    var frameID = getFrameID("tabs2");
    if (frameID) { //If the frame exists
        player = new YT.Player(frameID, {
            events: {
                "onStateChange": stopCycle
            }
        });
    }
});

// Example: function stopCycle, bound to onStateChange
function stopCycle(event) {
    alert("onStateChange has fired!\nNew state:" + event.data);
}

如果您想稍后调用其他功能,例如将视频静音,使用:

player.mute();
  • 如果您只需致电简单单向函数,没有必要使用此代码。相反,使用该函数callPlayer定义为这个答案.
  • 如果你想实现这个功能多帧,同时看看这个答案. 还包括详细的解释getFrameID and YT_ready.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 JavaScript 或 jQuery 监听 Youtube 事件 的相关文章

随机推荐

  • jinja2 嵌套变量

    我目前正在学习 jinja2 我不确定如何以正确的方式寻址变量 这是我在 yaml 中的变量 hosts app201 acme com eth0 ip 46 0 0 1 netmask 255 255 255 255 graphite a
  • 如何用javascript显示数据列表?

    嘿 我想在单击按钮时显示特定输入的数据列表 但我找不到如何操作 HTML
  • 切片集合的 Python 方式是什么?

    我有一些数据列表 例如 some data 1 2 4 1 6 23 3 56 6 2 3 5 6 32 2 12 5 3 2 我想获得具有固定长度的唯一值 我不关心我会得到哪个 并且我也希望它成为set 我知道我能做到set from s
  • 跨多个脚本定义公共变量?

    我有许多 Bash 和 Perl 脚本 它们在功能上不相关 但相关之处在于它们在同一项目中工作 它们在同一个项目中工作的事实意味着我通常在每个脚本的顶部指定相同的目录 相同的项目特定命令 相同的关键字 目前 这并没有让我感到困扰 但我知道将
  • LINQ 表达式返回属性值?

    我正在尝试创建一个通用函数来帮助我使用 LINQ to SQL 从本地列表中选择数千条记录 SQL Server 至少 2005 将查询限制为 2100 个参数 我想选择比这更多的记录 这是一个很好的用法示例 var some produc
  • WordPress 表单操作提交

    在 WordPress 中有一个自己定制的表单 action send form php 提交时 它总是转到send form php 但是这个 php 用于发送信息 我无法使用主题进行样式设置 有没有办法在发送信息并打印出来并在字段中显示
  • 如何使RequiredAttribute与枚举字段一起使用

    我最近意识到 requiredAttribute 不适用于枚举字段 假设我在表单上有两个名为 ddlOfficers 和 ddlApplicationTypes 的选择元素 这两个元素都是在 HtmlHelper 方法的帮助下呈现的 创建d
  • Swift:将参数传递给选择器

    使用 Swift 3 Xcode 8 2 1 Method func moveToNextTextField tag Int print tag 下面的行编译得很好 但是tag有一个未初始化的值 let selector selector
  • C# 中的 Windows 版本 [重复]

    这个问题在这里已经有答案了 我想知道 PC 的 Windows 版本 在 C Framework 3 5 中 我尝试过使用 操作系统 os 环境 OSVersion 版本 ver os Version 但结果是 平台 WIN32NT 版本6
  • 四元数旋转不起作用

    在适用于 Android 的 OpenGL ES 1 中 我有一个由 27 个较小的立方体组成的 Rubic 立方体 我想要旋转 导致特定的小立方体恰好位于视点前面 所以我需要两个向量 一个是从对象原点到特定立方体的向量 另一个是从原点到视
  • 如何对hmatrix进行自动微分?

    Sooooo 事实证明从假矩阵 to hmatrix事实证明数据类型并不平凡 序言供参考 LANGUAGE RankNTypes LANGUAGE ParallelListComp LANGUAGE ScopedTypeVariables
  • 如何在 PHP 中重写 register_argc_argv ?

    我正在使用共享主机 fasthostingdirect 并且出于某种原因 他们默认关闭此标志 这意味着我无法访问 PHP 命令行参数 除非我使用 n no php info 之后标记php exe 试过ini set register ar
  • 在 matplotlib 中使用 3D 数据生成热图

    我有一个函数returnValuesAtTime返回三个列表 x vals y vals and swe vals 所有三个列表的长度相同 并且每个元素swe vals对应于一个x value from x vals and a y val
  • 如何获取当前所有正在运行的任务

    我想获取在 android 中运行的所有任务 我在 ActivityManager 中找到了 getRunningTasks 但从 android 5 0 开始 getRunningTasks 可能不会提供所有任务 在我的情况下 它提供主屏
  • 重写 Javascript 中的等价比较

    是否可以重写 Javascript 中的等价比较 我得到的最接近的解决方案是定义 valueOf 函数并在对象前面加上加号来调用 valueOf 这有效 equal x y true 但这失败了 equal x y true why doe
  • clojure.java.jdbc/延迟查询大结果集

    我正在尝试从数据库读取数百万行并写入文本文件 这是我的问题的延续数据库转储到文本文件有副作用 我现在的问题似乎是在程序完成之前不会发生日志记录 我没有懒惰处理的另一个指标是 在程序完成之前根本不会写入文本文件 根据 IRC 提示 我的问题可
  • 如何在不破坏 Maven 发布插件的情况下传递 javac 多个命令行参数(其中一些包括冒号)?

    当我忘记在 a 中声明serialVersionUIDs 时 我想让我的 Maven 构建失败Serializable班级 和javac 这很容易 javac Xlint serial Werror Source java 直接将其转换为
  • 当您有行跨度时替换行颜色

    我有这个 HTML table class altRowTable 这工作正常 直到我有一些行包含rowspan 各行不一致 所以我有这样的东西 下面的 代表一个空格 不能真正在 SOF 中做表 ID name Number 1 joe 1
  • 释放字符串后仍然可以打印它吗?

    我正在学习和测试 C 中的内存分配 我想测试如果free 叫做 我预计可能存在分段错误或指针NULL当我运行下面的程序后 但是 我仍然可以成功打印输出中的字符串 我也尝试过免费str两次 然后输出 2 发生错误 看起来之前分配的内存已经成功
  • 使用 JavaScript 或 jQuery 监听 Youtube 事件

    我有一个滑块 其中包含 4 个通过 iframe 嵌入代码嵌入的 YouTube 视频 http www youtube com embed i enablejsapi 1 我正在努力使onStateChange四个视频中任何一个的事件调用