/**
* @file track-list.js
*/
'../event-target'에서 EventTarget 가져오기;
'../mixins/evented'에서 {isEvented} 가져오기;
/**
* {@link TextTrackList}, {@link AudioTrackList} 및 사이의 공통 기능
* {@link VideoTrackList}
*
* @extends 이벤트 타겟
*/
클래스 TrackList는 EventTarget {를 확장합니다.
/**
* 이 클래스의 인스턴스 생성
*
* @param {트랙[]} 트랙
* 목록을 초기화할 트랙 목록.
*
* @추상적인
*/
생성자(트랙 = []) {
감독자();
this.tracks_ = [];
/**
* @memberof 트랙리스트
* @member {번호} 길이
* 이 Trackist에 있는 `Track`의 현재 수입니다.
* @사례
*/
Object.defineProperty(이것, '길이', {
얻다() {
this.tracks_.length 반환;
}
});
에 대한 (하자 i = 0; i < 트랙.길이; i++) {
this.addTrack(트랙[i]);
}
}
/**
* `TrackList`에 {@link Track} 추가
*
* @param {트랙} 트랙
* 목록에 추가할 오디오, 비디오 또는 텍스트 트랙입니다.
*
* @fires 트랙리스트#addtrack
*/
addTrack(트랙) {
const 인덱스 = this.tracks_.length;
if (!('' + index in this)) {
Object.defineProperty(이것, 색인, {
얻다() {
return this.tracks_[인덱스];
}
});
}
// 중복 트랙을 추가하지 않음
if (this.tracks_.indexOf(track) === -1) {
this.tracks_.push(트랙);
/**
* 트랙 목록에 트랙이 추가되면 트리거됩니다.
*
* @event 트랙리스트#addtrack
* @type {이벤트대상~이벤트}
* @property {트랙} 트랙
* 추가된 트랙에 대한 참조입니다.
*/
this.trigger({
길,
유형: 'addtrack',
대상: 이
});
}
/**
* 트랙 레이블이 변경되면 트리거됩니다.
*
* @event 트랙리스트#addtrack
* @type {이벤트대상~이벤트}
* @property {트랙} 트랙
* 추가된 트랙에 대한 참조입니다.
*/
track.labelchange_ = () => {
this.trigger({
길,
유형: '라벨변경',
대상: 이
});
};
if (isEvented(트랙)) {
track.addEventListener('labelchange', track.labelchange_);
}
}
/**
* `TrackList`에서 {@link Track} 제거
*
* @param {트랙} rtrack
* 목록에서 제거할 오디오, 비디오 또는 텍스트 트랙입니다.
*
* @fires TrackList#removetrack
*/
removeTrack(rtrack) {
추적하자;
for (let i = 0, l = this.length; i < 엘; i++) {
if (이[i] === rtrack) {
트랙 = this[i];
경우 (track.off) {
트랙.오프();
}
this.tracks_.splice(i, 1);
부서지다;
}
}
if (!트랙) {
반품;
}
/**
* 트랙 목록에서 트랙이 제거되면 트리거됩니다.
*
* @event 트랙리스트#removetrack
* @type {이벤트대상~이벤트}
* @property {트랙} 트랙
* 제거된 트랙에 대한 참조입니다.
*/
this.trigger({
길,
유형: 'removetrack',
대상: 이
});
}
/**
* 트랙 ID로 TrackList에서 트랙 가져오기
*
* @param {string} id - 가져올 트랙의 id
* @method getTrackById
* @return {트랙}
* @사적인
*/
getTrackById(ID) {
let 결과 = null;
for (let i = 0, l = this.length; i < 엘; i++) {
const track = this[i];
경우 (track.id === id) {
결과 = 트랙;
부서지다;
}
}
반환 결과;
}
}
/**
* 다른 트랙이 선택/활성화되면 트리거됩니다.
*
* @event 트랙리스트#변경
* @type {이벤트대상~이벤트}
*/
/**
* on + eventName으로 호출할 수 있는 이벤트. {@link EventHandler}를 참조하세요.
*
* @property {객체} TrackList#allowedEvents_
* @사적인
*/
TrackList.prototype.allowedEvents_ = {
변경: '변경',
addtrack: '추가트랙',
removetrack: '제거트랙',
labelchange: '라벨체인지'
};
// 기능 감지를 허용하기 위해 속성 EventHandler 지원을 에뮬레이션합니다.
for (TrackList.prototype.allowedEvents_의 const 이벤트) {
TrackList.prototype['on' + event] = null;
}
기본 TrackList 내보내기;