/**
* @file load-progress-bar.js
*/
從 '../../component.js' 導入組件;
import * as Dom from '../../utils/dom.js';
從 '../../utils/clamp' 導入夾具;
從“全局/文檔”導入文檔;
// 獲取時間佔總結束時間的百分比寬度
const percentify = (time, end) => clamp((time / end) * 100, 0, 100).toFixed(2) + '%';
/**
* 顯示加載進度
*
* @extends 組件
*/
類 LoadProgressBar 擴展組件 {
/**
* 創建此類的一個實例。
*
* @param {Player} 播放器
* 此類應附加到的 `Player`。
*
* @param {對象} [選項]
* 播放器選項的鍵/值存儲。
*/
構造函數(播放器,選項){
超級(播放器,選項);
this.partEls_ = [];
this.on(player, 'progress', (e) => this.update(e));
}
/**
* 創建 `Component` 的 DOM 元素
*
* @return {元素}
* 創建的元素。
*/
創建El() {
const el = super.createEl('div', {className: 'vjs-load-progress'});
const wrapper = Dom.createEl('span', {className: 'vjs-control-text'});
const loadedText = Dom.createEl('span', {textContent: this.localize('Loaded')});
const separator = document.createTextNode(': ');
this.percentageEl_ = Dom.createEl('span', {
className: 'vjs-control-text-loaded-percentage',
文字內容:'0%'
});
el.appendChild(包裝器);
wrapper.appendChild(loadedText);
wrapper.appendChild(分隔符);
wrapper.appendChild(this.percentageEl_);
返回 el;
}
處置(){
this.partEls_ = null;
this.percentageEl_ = null;
super.dispose();
}
/**
* 更新進度條
*
* @param {EventTarget~Event} [事件]
* 導致此函數運行的 `progress` 事件。
*
* @listens Player#progress
*/
更新(事件){
this.requestNamedAnimationFrame('LoadProgressBar#update', () => {
const liveTracker = this.player_.liveTracker;
const buffered = this.player_.buffered();
const duration = (liveTracker && liveTracker.isLive()) ? liveTracker.seekableEnd() : this.player_.duration();
const bufferedEnd = this.player_.bufferedEnd();
const children = this.partEls_;
const percent = percentify(bufferedEnd, duration);
如果(this.percent_!==百分比){
//更新進度條的寬度
this.el_.style.width = 百分比;
// 更新控製文本
Dom.textContent(this.percentageEl_, percent);
this.percent_ = 百分比;
}
// 添加子元素來表示各個緩衝時間範圍
對於(讓 i = 0;i < buffered.length;i++){
const start = buffered.start(i);
const end = buffered.end(i);
讓 part = children[i];
如果(!部分){
part = this.el_.appendChild(Dom.createEl());
孩子[i] = 部分;
}
// 僅在更改時更新
如果(part.dataset.start === 開始 && part.dataset.end === 結束){
繼續;
}
part.dataset.start = 開始;
part.dataset.end = 結束;
// 根據進度條的寬度設置百分比 (bufferedEnd)
part.style.left = percentify(start, bufferedEnd);
part.style.width = percentify(end - start, bufferedEnd);
}
// 刪除未使用的緩衝範圍元素
for (let i = children.length; i > buffered.length; i--) {
this.el_.removeChild(children[i - 1]);
}
children.length = buffered.length;
});
}
}
Component.registerComponent('LoadProgressBar', LoadProgressBar);
導出默認 LoadProgressBar;