/**
* @file clickable-component.js
*/
從 './component' 導入組件;
import * as Dom from './utils/dom.js';
從 './utils/log.js' 導入日誌;
從'./utils/obj'導入{assign};
從“鍵碼”導入鍵碼;
/**
* 可點擊或鍵盤操作的組件,但不是
* 本機 HTML 按鈕。
*
* @extends 組件
*/
類 ClickableComponent 擴展組件 {
/**
* 創建此類的一個實例。
*
* @param {Player} 播放器
* 此類應附加到的 `Player`。
*
* @param {對象} [選項]
* 組件選項的鍵/值存儲。
*
* @param {function} [options.clickHandler]
* 單擊/激活按鈕時調用的函數
*
* @param {string} [options.controlText]
* 在按鈕上設置的文本
*
* @param {string} [options.className]
* 類或空格分隔的類列表以添加組件
*
*/
構造函數(播放器,選項){
超級(播放器,選項);
如果(this.options_.controlText){
this.controlText(this.options_.controlText);
}
this.handleMouseOver_ = (e) => this.handleMouseOver(e);
this.handleMouseOut_ = (e) => this.handleMouseOut(e);
this.handleClick_ = (e) => this.handleClick(e);
this.handleKeyDown_ = (e) => this.handleKeyDown(e);
this.emitTapEvents();
這個。啟用();
}
/**
* 創建 `ClickableComponent` 的 DOM 元素。
*
* @param {string} [tag=div]
* 元素的節點類型。
*
* @param {對象} [道具={}]
* 應在元素上設置的屬性對象。
*
* @param {對象} [屬性={}]
* 應在元素上設置的屬性對象。
*
* @return {元素}
* 被創建的元素。
*/
createEl(tag = 'div', props = {}, attributes = {}) {
道具=分配({
類名:this.buildCSSClass(),
選項卡索引: 0
}, 道具);
如果(標籤==='按鈕'){
log.error(`不支持使用 ${tag} 的 HTML 元素創建 ClickableComponent;請改用 Button。`);
}
// 為不是原生 HTML 按鈕的可點擊元素添加 ARIA 屬性
屬性=分配({
作用:“按鈕”
}, 屬性);
this.tabIndex_ = props.tabIndex;
const el = Dom.createEl(tag, props, attributes);
el.appendChild(Dom.createEl('span', {
className: 'vjs-icon-placeholder'
},{
'aria-hidden': true
}));
this.createControlTextEl(el);
返回 el;
}
處置(){
// 在處理時刪除 controlTextEl_
this.controlTextEl_ = null;
super.dispose();
}
/**
* 在此 `ClickableComponent` 上創建一個控製文本元素
*
* @param {元素} [el]
* 控件文本的父元素。
*
* @return {元素}
* 創建的控製文本元素。
*/
createControlTextEl(el) {
this.controlTextEl_ = Dom.createEl('span', {
類名:'vjs-control-text'
},{
// 讓屏幕閱讀器用戶知道元素的文本可能會改變
'aria-live':'禮貌'
});
如果(EL){
el.appendChild(this.controlTextEl_);
}
this.controlText(this.controlText_, el);
返回 this.controlTextEl_;
}
/**
* 獲取或設置本地化文本以用於 `ClickableComponent` 上的控件。
*
* @param {字符串} [文本]
* 元素的控製文本。
*
* @param {元素} [el=this.el()]
* 設置標題的元素。
*
* @return {字符串}
* - 獲取時的控製文本
*/
controlText(text, el = this.el()) {
如果(文本===未定義){
返回 this.controlText_ || '需要文字';
}
const localizedText = this.localize(文本);
this.controlText_ = 文本;
Dom.textContent(this.controlTextEl_, localizedText);
如果(!this.nonIconControl && !this.player_.options_.noUITitleAttributes){
// 如果只顯示一個圖標,設置 title 屬性
el.setAttribute('title', localizedText);
}
}
/**
* 構建默認的 DOM `className`。
*
* @return {字符串}
* 此對象的 DOM `className`。
*/
buildCSSClass() {
返回`vjs-control vjs-button ${super.buildCSSClass()}`;
}
/**
* 啟用這個 `ClickableComponent`
*/
使能夠() {
如果(!this.enabled_){
this.enabled_ = true;
this.removeClass('vjs-disabled');
this.el_.setAttribute('aria-disabled', 'false');
如果(這種類型。標籤索引 _!== '未定義') {
this.el_.setAttribute('tabIndex', this.tabIndex_);
}
this.on(['點擊', '點擊'], this.handleClick_);
this.on('keydown', this.handleKeyDown_);
}
}
/**
* 禁用這個 `ClickableComponent`
*/
禁用(){
this.enabled_ = false;
this.addClass('vjs-disabled');
this.el_.setAttribute('aria-disabled', 'true');
如果(這種類型。標籤索引 _!== '未定義') {
this.el_.removeAttribute('tabIndex');
}
this.off('mouseover', this.handleMouseOver_);
this.off('mouseout', this.handleMouseOut_);
this.off(['tap', 'click'], this.handleClick_);
this.off('keydown', this.handleKeyDown_);
}
/**
* 為組件中的播放器處理 ClickableComponent 中的語言更改
*
*
*/
handleLanguagechange() {
this.controlText(this.controlText_);
}
/**
* 當 `ClickableComponent` 接收到
* `click` 或 `tap` 事件。
*
* @param {EventTarget~Event} 事件
* 導致調用此函數的 `tap` 或 `click` 事件。
*
* @listens 水龍頭
* @listens 點擊
* @抽象的
*/
handleClick(事件){
如果(this.options_.clickHandler){
this.options_.clickHandler.call(this, arguments);
}
}
/**
* 當 `ClickableComponent` 接收到
* `keydown` 事件。
*
* 默認情況下,如果按鍵是Space或Enter,它會觸發一個`click`事件。
*
* @param {EventTarget~Event} 事件
* 導致調用此函數的 `keydown` 事件。
*
* @listens 按鍵
*/
handleKeyDown(事件){
// 支持空格鍵或回車鍵操作觸發點擊事件。還,
// 防止事件通過 DOM 傳播並觸發
// 播放器熱鍵。
if (keycode.isEventKey(event, 'Space') || keycode.isEventKey(event, 'Enter')) {
事件.preventDefault();
事件.stopPropagation();
this.trigger('點擊');
}其他{
// 為不支持的鍵傳遞按鍵處理
super.handleKeyDown(事件);
}
}
}
Component.registerComponent('ClickableComponent', ClickableComponent);
導出默認的 ClickableComponent;