VideoJS v5 - 在 ES6 中添加自定义组件 - 我做得对吗?
VideoJS v5 - adding custom components in ES6 - am I doing it right?
我正在为 VideoJS v5 编写一个社交共享插件:我想在控件栏下方的播放器标记中添加一个div,其中包含几个链接,这些链接将允许在我的网站上的一篇文章中对播放器实例进行社交共享。我在 ES6 工作。
VideoJS 文档很少,尤其是对于 v5 - 我正在源代码中四处寻找,试图弄清楚如何做到这一点。我确实找到了这个子类化 VideoJS 组件的示例。
这是我到目前为止所得到的 - 如果我犯了风格犯罪,请道歉,我对 VideoJS 插件或 ES6 类没有太多经验。
videojs.plugin('social-share', function(opts) {
let player = this;
const Component = videojs.getComponent('Component');
const ClickableComponent = videojs.getComponent('ClickableComponent');
class VjsShareBar extends Component {
constructor(player, opts) {
super(player, opts);
}
createEl() {
return super.createEl('div', {
className: 'vjs-share-bar video-share share-buttons'
}, {
'role': 'group'
});
}
}
class VjsShareButton extends Component {
constructor(player, opts) {
super(player, opts);
}
createEl() {
return super.createEl('a', {
className: 'share-button'
})
}
}
let twitterShareBtn = new VjsShareButton(player, opts);
twitterShareBtn.addClass('twitter');
let twitterShareIcon = new Component(player, opts);
let fbShareBtn = new VjsShareButton(player, opts);
fbShareBtn.addClass('facebook');
let vjsShareBar = player.addChild(new VjsShareBar(player, opts));
vjsShareBar.addChild(twitterShareBtn);
vjsShareBar.addChild(fbShareBtn);
});
这会将预期的元素添加到video-js
容器内的播放器标记中:
<div class="vjs-share-bar video-share share-buttons" role="group">
<a class="share-button twitter"></a>
<a class="share-button facebook"></a>
</div>
我是否需要这种为每个元素扩展新子类的方法?似乎有点笨拙。有没有办法简单地为我要创建的每个元素创建一个 VideoJS 组件类的新实例,每次都传递不同的标签名和类?我需要在 a
标签中添加跨度,为每个标签扩展一个新的 Component
子类的想法似乎有点过分了。
(我的站点中的现有事件处理程序将处理对链接的点击,因此我不打算使用播放器 API 侦听点击事件。而且我正在使用简单的Component
类,因为不希望额外的 bumph 更具体的类,如 ClickableComponent
和 Button
添加到标记中。
已经很老了,但我写了一篇关于如何以灵活的方式为Video.js创建自定义组件的文章。
不幸的是,他们的文档还没有超级有用,所以我写了这篇文章。https://nikushx.com/blog/2019/05/21/creating-custom-components-with-video-js/
class ToggleCaptionsButton extends videojs.getComponent('Button') {
constructor(player, options = {}) {
super(player, options);
this.addClass('vjs-captions-toggle');
// captions are "on" by default
this.addClass('vjs-captions-on');
}
/**
* Toggle the subtitle track on and off upon click
*/
public handleClick(_e) {
const textTracks = this.player.textTracks();
for (let i = 0; i < textTracks.length; i++) {
if (textTracks[i].kind !== 'subtitles') {
continue;
}
// toggle showing the captions
if (textTracks[i].mode === 'showing') {
textTracks[i].mode = 'hidden';
this.removeClass('vjs-captions-on');
} else {
textTracks[i].mode = 'showing';
this.addClass('vjs-captions-on');
}
}
}
}
除了@Nikush很好的答案之外,我还想添加一些信息,以便其他人可以更快地找到解决方案。
您可以使用官方的video-js插件生成器来深入了解video.js的bes插件/组件模板。
由于视频提供的文档质量低,经过长时间的卡住.js 这是我为以下方面找到的最佳模板:
1. 组件:
import document from "global/document";
import video.js from "video.js";
/**
* @file etom-extras-logo-control-bar.js
*/
/**
* Add company logo with hyperlink link to control bar with options.
*
* @extends Button
*/
//+++ Request videojs component (Button) [OR ANY OTHER COMPONENT LIKE (Component) +++//
const Button = videojs.getComponent("Button");
//+++ Default options for the Component. +++//
const defaults = {};
class EtomExtrasLogoInBar extends Button {
/**
* Creates an instance of this class.
*
* @param {Player} player
* The `Player` that this class should be attached to.
*
* @param {Object} [options={}]
* The key/value store of player options.
*/
constructor(player, options = {}) {
super(player, options);
options = videojs.mergeOptions(defaults, options);
const settings = {};
const {} = settings;
// start your work!!
}
}
videojs.registerComponent("etomExtrasLogoInBar", EtomExtrasLogoInBar);
export default EtomExtrasLogoInBar;
1. 插件:
import document from "global/document";
import video.js from "video.js";
/** Import required plugins
** import "videojs-playlist";
** import "./extras/plugins/overlay/etom-extras-videojs-overlay";
* @file etom-extras-playlist-extend.js
*/
/**
* Extend videoJs default playlist with extra features..
*
* @extends Plugin
*/
const Plugin = videojs.getPlugin("plugin");
// Default options for the plugin.
const defaults = {};
class EtomExtras extends Plugin {
/**
* Create a EtomExtras plugin instance.
*
* @param {Player} player
* A Video.js Player instance.
*
* @param {Object} [options]
* An optional options object.
*
* While not a core part of the Video.js plugin architecture, a
* second argument of options is a convenient way to accept inputs
* from your plugin's caller.
*/
constructor(player, options = {}) {
super(player, options);
options = videojs.mergeOptions(defaults, options);
const settings = {};
const {} = settings;
// start your work!!
}
}
// Define default values for the plugin's `state` object here.
EtomExtras.defaultState = {};
// Include the version number.
EtomExtras.VERSION = VERSION;
// Register the plugin with video.js.
videojs.registerPlugin("etomExtras", EtomExtras);
export default EtomExtras;
请记住,您可以将组件和插件放在同一个文件中,并使用与上述相同的文件。
谢谢大家。
- 自定义HTML元素属性未显示-Web组件
- 将自定义脚本加载到Vue.js组件中
- 将自定义Google Sheets功能转换为附加组件
- 如何正确自定义第三方反应组件
- 将自定义属性添加到 vuejs 组件
- 对自定义组件中的本地访问引用进行反应
- Angular 2中组件的自定义用户模板
- 点击tpl链接时,ExtJS 4.2自定义组件触发事件
- 如何使用Angular 1.5组件将属性求值为字符串,这是一个自定义函数
- Angular2中列表组件的自定义模板(不包含ng内容的transclusion)
- 如何使用组件和自定义验证实现Angular 1 Form
- Extjs 4,事件处理,范围,自定义组件
- Gwd自定义组件及其事件处理程序
- 使用普通javascript和验证的自定义web组件
- 从自定义组件内部查找 Ember
- Windows 8 Metro UI HTML 应用中的自定义可重用 UI 组件
- 在 React 组件中检索自定义 data-* 属性值(无事件)
- 在 ionic 2 中缓存自定义组件内容
- 挖空绑定自定义组件,使其不与中心视图模型冲突
- 使用 Aurelia在视图中动态生成自定义组件