/**
* @file text-track-menu-item.js
*/
從 '../../menu/menu-item.js' 導入 MenuItem;
從 '../../component.js' 導入組件;
從“全局/窗口”導入窗口;
從“全局/文檔”導入文檔;
/**
* 用於在文本軌道類型中選擇語言的特定菜單項類型
*
* @extends 菜單項
*/
類 TextTrackMenuItem 擴展 MenuItem {
/**
* 創建此類的一個實例。
*
* @param {Player} 播放器
* 此類應附加到的 `Player`。
*
* @param {對象} [選項]
* 播放器選項的鍵/值存儲。
*/
構造函數(播放器,選項){
const track = options.track;
const tracks = player.textTracks();
// 修改父 MenuItem 類的 init 的選項。
options.label = track.label ||跟踪語言 || '未知';
options.selected = track.mode === '顯示';
超級(播放器,選項);
this.track = 軌道;
// 確定此組件和過濾器的相關軌道類型
// 空種類。
this.kinds = (options.kinds || [options.kind || this.track.kind]).filter(Boolean);
const changeHandler = (...args) => {
this.handleTracksChange.apply(this, args);
};
const selectedLanguageChangeHandler = (...args) => {
this.handleSelectedLanguageChange.apply(this, args);
};
player.on(['loadstart', 'texttrackchange'], changeHandler);
tracks.addEventListener('change', changeHandler);
tracks.addEventListener('selectedlanguagechange', selectedLanguageChangeHandler);
this.on('處置', function() {
player.off(['loadstart', 'texttrackchange'], changeHandler);
tracks.removeEventListener('change', changeHandler);
tracks.removeEventListener('selectedlanguagechange', selectedLanguageChangeHandler);
});
// iOS7 doesn't dispatch change events to TextTrackLists when an
// 相關軌道的模式改變。沒有類似的東西
// Object.observe()(在 iOS7 上也不存在),它不是
// 可以檢測模式屬性和 polyfill 的變化
// 改變事件。作為一個糟糕的替代品,我們手動調度
// 每當控件修改模式時更改事件。
如果(tracks.onchange ===未定義){
讓事件;
this.on(['點擊', '點擊'], 函數() {
if (typeof window.Event !== 'object') {
// Android 2.3 為 window.Event 拋出 Illegal Constructor 錯誤
嘗試{
event = new window.Event('改變');
} 抓住(錯誤){
// 不管錯誤繼續
}
}
如果(!事件){
event = document.createEvent('事件');
event.initEvent('改變', 真, 真);
}
tracks.dispatchEvent(事件);
});
}
// 根據當前曲目設置默認狀態
this.handleTracksChange();
}
/**
* 當 `TextTrackMenuItem` 被“點擊”時調用。看
* {@link ClickableComponent} 以獲取有關點擊的更多詳細信息。
*
* @param {EventTarget~Event} 事件
* 導致此功能被執行的 `keydown`、`tap` 或 `click` 事件
* 打電話。
*
* @listens 水龍頭
* @listens 點擊
*/
handleClick(事件){
const referenceTrack = this.track;
const tracks = this.player_.textTracks();
super.handleClick(事件);
如果(!曲目){
返回;
}
for (let i = 0; i < tracks.length; i++) {
const track = tracks[i];
// 如果文本軌道列表中的軌道類型不正確,
// 跳過它。我們不想影響不兼容類型的曲目。
如果 (this.kinds.indexOf(track.kind) === -1) {
繼續;
}
// 如果此文本軌道是組件的軌道並且未顯示,
// 設置為顯示。
如果(軌道===參考軌道){
if (track.mode !== 'showing') {
track.mode = '顯示';
}
// 如果這個文本軌道不是組件的軌道並且它不是
//禁用,將其設置為禁用。
} else if (track.mode !== 'disabled') {
track.mode = '禁用';
}
}
}
/**
* 處理文本曲目列表更改
*
* @param {EventTarget~Event} 事件
* 導致此函數被調用的 `change` 事件。
*
* @listens TextTrackList#change
*/
handleTracksChange(事件){
const shouldBeSelected = this.track.mode === '顯示';
// 防止多餘的 selected() 調用,因為它們可能會導致
// 屏幕閱讀器不必要地閱讀附加的控製文本
if (shouldBeSelected !== this.isSelected_) {
this.selected(shouldBeSelected);
}
}
handleSelectedLanguageChange(事件){
如果(this.track.mode ==='顯示'){
const selectedLanguage = this.player_.cache_.selectedLanguage;
// 跨同一種語言不要替換那種曲目
如果(選定語言 && 選定語言。已啟用 &&
selectedLanguage.language === this.track.language &&
selectedLanguage.kind !== this.track.kind) {
返回;
}
this.player_.cache_.selectedLanguage = {
啟用:真,
語言:this.track.language,
種類:this.track.kind
};
}
}
處置(){
// 在處理時刪除對跟踪對象的引用
this.track = null;
super.dispose();
}
}
Component.registerComponent('TextTrackMenuItem', TextTrackMenuItem);
導出默認 TextTrackMenuItem;