/**
* @Datei text-track-menu-item.js
* /
import MenuItem from '../../menu/menu-item.js';
importiere Komponente aus '../../component.js';
import window from 'global/window';
dokument aus 'global/document' importieren;
/**
* Der spezifische Menüpunkttyp für die Auswahl einer Sprache innerhalb einer Textspurart
*
* @extends MenuItem
* /
class TextTrackMenuItem extends MenuItem {
/**
* Erzeugt eine Instanz dieser Klasse.
*
* @param {Player} Spieler
* Der `Player`, dem diese Klasse zugeordnet werden soll.
*
* @param {Object} [Optionen]
* Der Schlüssel/Wertspeicher der Playeroptionen.
* /
constructor(spieler, optionen) {
const track = options.track;
const tracks = player.textTracks();
// Ändern Sie die Optionen für die Init der übergeordneten MenuItem-Klasse.
options.label = track.label || track.language || 'Unknown';
options.selected = track.mode === 'showing';
super(Spieler, Optionen);
this.track = track;
// Bestimmen Sie die relevante(n) Art(en) von Spuren für diese Komponente und filtern Sie
// aus leeren Arten.
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('dispose', function() {
player.off(['loadstart', 'texttrackchange'], changeHandler);
tracks.removeEventListener('change', changeHandler);
tracks.removeEventListener('selectedlanguagechange', selectedLanguageChangeHandler);
});
// iOS7 sendet keine Änderungsereignisse an TextTrackLists, wenn ein
// Der Modus der zugehörigen Spur ändert sich. Ohne etwas wie
// Object.observe() (ebenfalls nicht vorhanden auf iOS7), ist es nicht
// Erkennung von Änderungen am Modus-Attribut und Polyfill möglich
// das Änderungsereignis. Als schlechten Ersatz versenden wir manuell
// Änderungsereignisse, wenn die Steuerelemente den Modus ändern.
if (tracks.onchange === undefined) {
ereignis lassen;
this.on(['tap', 'click'], function() {
if (typeof window.Event !== 'object') {
// Android 2.3 löst einen Illegal Constructor Fehler für window.Event aus
Versuchen {
event = new window.Event('change');
} catch (err) {
// Fortsetzen ohne Rücksicht auf Fehler
}
}
if (!event) {
event = document.createEvent('Event');
event.initEvent('change', true, true);
}
tracks.dispatchEvent(event);
});
}
// Festlegen des Standardstatus basierend auf den aktuellen Tracks
this.handleTracksChange();
}
/**
* Diese Funktion wird aufgerufen, wenn ein "TextTrackMenuItem" angeklickt wird. Sehen
* {@link ClickableComponent} für genauere Informationen darüber, was ein Klick sein kann.
*
* @param {EventTarget~Event} event
* Das `Keydown`-, `Tap`- oder `Click`-Ereignis, das diese Funktion ausgelöst hat
* genannt.
*
* @listens tap
* @listens klicken
* /
handleClick(event) {
const referenceTrack = this.track;
const tracks = this.player_.textTracks();
super.handleClick(event);
if (!tracks) {
rückkehr;
}
for (let i = 0; i < tracks.length; i++) {
const track = tracks[i];
// Wenn der Track aus der Liste der Text-Tracks nicht von der richtigen Art ist,
// Überspringen Sie es. Wir wollen nicht, dass Spuren unvereinbarer Art(en) beeinträchtigt werden.
if (this.kinds.indexOf(track.kind) === -1) {
weiter;
}
// Wenn diese Textspur die Spur der Komponente ist und sie nicht angezeigt wird,
// auf "Anzeigen" einstellen.
if (track === referenceTrack) {
if (track.mode !== 'showing') {
track.mode = 'anzeigen';
}
// Wenn diese Textspur nicht die Spur der Komponente ist und es sich nicht um
// deaktiviert, setzen Sie ihn auf deaktiviert.
} else if (track.mode !== 'disabled') {
track.mode = 'deaktiviert';
}
}
}
/**
* Änderung der Textspurliste handhaben
*
* @param {EventTarget~Event} event
* Das "Change"-Ereignis, das zum Aufruf dieser Funktion geführt hat.
*
* @listens TextTrackList#ändern
* /
handleTracksChange(event) {
const shouldBeSelected = this.track.mode === 'showing';
// Vermeiden Sie redundante selected()-Aufrufe, da diese zu
// Bildschirmlesegeräte lesen den angehängten Kontrolltext unnötigerweise
if (shouldBeSelected !== this.isSelected_) {
this.selected(shouldBeSelected);
}
}
handleSelectedLanguageChange(event) {
if (this.track.mode === 'showing') {
const selectedLanguage = this.player_.cache_.selectedLanguage;
// Ersetzen Sie nicht die Art der Spur in derselben Sprache
if (selectedLanguage && selectedLanguage.enabled &&
selectedLanguage.language === this.track.language &&
selectedLanguage.kind !== this.track.kind) {
rückkehr;
}
this.player_.cache_.selectedLanguage = {
aktiviert: wahr,
sprache: this.track.language,
art: this.track.kind
};
}
}
dispose() {
// Entfernen der Referenz auf das Track-Objekt bei Dispose
this.track = null;
super.dispose();
}
}
Component.registerComponent('TextTrackMenuItem', TextTrackMenuItem);
standard TextTrackMenuItem exportieren;