Video.js:通过插件向控制栏添加菜单

时间:2014-03-20 04:27:54

标签: javascript html5-video video.js

我试图通过插件尝试将菜单发送到video.js播放器的控制栏。这是我最终目标的demo。问题是该演示是在video.js本身的控制栏中添加一个菜单,而我想要一个添加菜单的插件。

到目前为止,我已经能够创建一个向控件栏添加MenuButton的插件,但我无法使用任何菜单项填充菜单。

这是我现在所处的demo

问题是当我尝试使用PlaybackRateMenuItem创建新的new videojs.PlaybackRateMenuItem(this, {rate: rates[i] + 'x'})对象时。 JS控制台在video.dev.js的第805行引发以下错误:

Uncaught TypeError: Cannot read property 'guid' of undefined

这对应于未分类版本中的以下功能:

vjs.bind = function(context, fn, uid) {
    // Make sure the function has a unique ID
    if (!fn.guid) {
        fn.guid = vjs.guid++;
    }

    ... omitted ...
};

或者更具体地说,这一行:if (!fn.guid) {

从调试器中逐步执行,我看到fn正在传递为undefined,函数的调用者是:

vjs.bind(this.player(), this.player().reportUserActivity);

当调用此函数时,this.player()返回一个已定义的值,但一旦调用vjs.bind,两个参数都将变为未定义,我不知道为什么。任何想法或正确方向的观点?谢谢!

1 个答案:

答案 0 :(得分:0)

原来我在这里遇到两个主要问题。

  1. 为我的扩展createMenu类的类重写createItems方法而不是videojs.MenuButton方法。
  2. this类的构造函数的videojs.MenuItem参数必须是videojs player对象,而不仅仅是this。问题是这个对象的名称在video.js的缩小版本中被破坏了。对于这种情况,我发现使用this.c是播放器对象,但总的来说,我发现使用未分类的版本video.dev.js更容易,而不必处理名称修改。在这种情况下,使用this.player_是正确的。