/**
* @文件音量控制.js
*/
從 '../component.js' 導入組件;
從 '../utils/obj' 導入 {isPlain};
import * as Events from '../utils/events.js';
從“鍵碼”導入鍵碼;
從“全局/文檔”導入文檔;
// 必需的孩子
導入'./volume-control/volume-control.js';
導入'./mute-toggle.js';
/**
* 包含 MuteToggle 和 VolumeControl 的組件,以便
* 他們可以一起工作。
*
* @extends 組件
*/
類 VolumePanel 擴展組件 {
/**
* 創建此類的一個實例。
*
* @param {Player} 播放器
* 此類應附加到的 `Player`。
*
* @param {對象} [選項={}]
* 播放器選項的鍵/值存儲。
*/
構造函數(播放器,選項= {}){
if (typeof options.inline !== 'undefined') {
options.inline = options.inline;
}其他{
options.inline = true;
}
// 如果垂直,則將內聯選項向下傳遞給 VolumeControl
// 音量控制開啟。
if (typeof options.volumeControl === 'undefined' || isPlain(options.volumeControl)) {
options.volumeControl = options.volumeControl || {};
options.volumeControl.vertical = !options.inline;
}
超級(播放器,選項);
// 此處理程序由下面的鼠標處理程序方法使用
this.handleKeyPressHandler_ = (e) => this.handleKeyPress(e);
this.on(player, ['loadstart'], (e) => this.volumePanelState_(e));
this.on(this.muteToggle, 'keyup', (e) => this.handleKeyPress(e));
this.on(this.volumeControl, 'keyup', (e) => this.handleVolumeControlKeyUp(e));
this.on('keydown', (e) => this.handleKeyPress(e));
this.on('mouseover', (e) => this.handleMouseOver(e));
this.on('mouseout', (e) => this.handleMouseOut(e));
// 當滑塊處於活動狀態時(鼠標已被按下並
// 正在拖動)我們不想隱藏 VolumeBar
this.on(this.volumeControl, ['slideractive'], this.sliderActive_);
this.on(this.volumeControl, ['sliderinactive'], this.sliderInactive_);
}
/**
* 將 vjs-slider-active 類添加到 VolumePanel
*
* @listens 音量控制#slideractive
* @私人的
*/
sliderActive_() {
this.addClass('vjs-slider-active');
}
/**
* 將 vjs-slider-active 類移除到 VolumePanel
*
* @listens VolumeControl#sliderinactive
* @私人的
*/
sliderInactive_() {
this.removeClass('vjs-slider-active');
}
/**
* 添加 vjs-hidden 或 vjs-mute-toggle-only 到 VolumePanel
* 取決於 MuteToggle 和 VolumeControl 狀態
*
* @listens Player#loadstart
* @私人的
*/
volumePanelState_() {
// 如果既沒有音量控制也沒有靜音切換,則隱藏音量面板
// 被顯示
if (this.volumeControl.hasClass('vjs-hidden') && this.muteToggle.hasClass('vjs-hidden')) {
this.addClass('vjs-hidden');
}
// 如果只有靜音開關可見,我們不想要
// 音量面板在懸停或活動時擴展
if (this.volumeControl.hasClass('vjs-hidden') && !this.muteToggle.hasClass('vjs-hidden')) {
this.addClass('vjs-mute-toggle-only');
}
}
/**
* 創建 `Component` 的 DOM 元素
*
* @return {元素}
* 創建的元素。
*/
創建El() {
讓 orientationClass = 'vjs-volume-panel-horizontal';
如果(!this.options_.inline){
orientationClass = 'vjs-volume-panel-vertical';
}
返回 super.createEl('div', {
類名:`vjs-volume-panel vjs-control ${orientationClass}`
});
}
/**
* 處理 `volume-panel` 和所有子組件。
*/
處置(){
這個.handleMouseOut();
super.dispose();
}
/**
* 處理 `VolumeControl` 上的 `keyup` 事件,尋找關閉的 ESC
* 音量面板並將焦點設置在“MuteToggle”上。
*
* @param {EventTarget~Event} 事件
* 導致調用此函數的 `keyup` 事件。
*
* @listens 按鍵
*/
handleVolumeControlKeyUp(事件){
如果 (keycode.isEventKey(event, 'Esc')) {
this.muteToggle.focus();
}
}
/**
* 當 `VolumePanel` 通過 `mouseover` 事件懸停時調用。
* 打開監聽`mouseover` 事件。當它們發生時
* 調用 `this.handleMouseOver`。
*
* @param {EventTarget~Event} 事件
* 導致調用此函數的 `mouseover` 事件。
*
* @listens 鼠標懸停
*/
handleMouseOver(事件){
this.addClass('vjs-懸停');
Events.on(document, 'keyup', this.handleKeyPressHandler_);
}
/**
* 當 `VolumePanel` 通過 `mouseout` 事件懸停時調用。
* 打開監聽 `mouseout` 事件。當它們發生時
* 調用 `this.handleMouseOut`。
*
* @param {EventTarget~Event} 事件
* 導致調用此函數的 `mouseout` 事件。
*
* @listens 鼠標移出
*/
handleMouseOut(事件){
this.removeClass('vjs-hover');
Events.off(文檔, 'keyup', this.handleKeyPressHandler_);
}
/**
* 處理文檔上的 `keyup` 事件或 `VolumePanel` 上的 `keydown` 事件,
* 尋找隱藏 `VolumeControl` 的 ESC。
*
* @param {EventTarget~Event} 事件
* 觸發此事件的按鍵。
*
* @listens 按鍵 |按鍵
*/
handleKeyPress(事件){
如果 (keycode.isEventKey(event, 'Esc')) {
這個.handleMouseOut();
}
}
}
/**
* `VolumeControl` 的默認選項
*
* @type {對象}
* @私人的
*/
VolumePanel.prototype.options_ = {
孩子們: [
'靜音切換',
'音量控制'
]
};
Component.registerComponent('VolumePanel', VolumePanel);
導出默認音量面板;