El Atributo ONCUECHANGE

Es un evento de JavaScript que se activa cuando un cue (segmento de tiempo de texto) en una pista de texto cambia durante la reproducción de elementos multimedia.
El atributo oncuechange es un evento de JavaScript que se activa cuando un cue (segmento de tiempo de texto) en una pista de texto (subtítulos, descripciones, etc.) cambia durante la reproducción de elementos multimedia. Es especialmente útil para crear experiencias interactivas sincronizadas con contenido de audio o video, como subtítulos dinámicos, cuestionarios en tiempo real, o efectos visuales vinculados a momentos específicos.
¿Qué es un "cue"?
Un cue es un fragmento de texto con un intervalo de tiempo definido en una pista de texto (archivo WebVTT). Por ejemplo:
WEBVTT 00:00:02.000 --> 00:00:05.000 ¡Bienvenidos al tutorial! 00:00:06.000 --> 00:00:10.000 Hoy aprenderemos sobre el evento oncuechange.
¿Dónde se aplica?
Funciona en elementos que admiten pistas de texto:
-
<video>con<track> -
<audio>con<track>(aunque menos común)
Sintaxis básica
Como atributo HTML:
<video controls>
<source src="video.mp4" type="video/mp4">
<track
src="subtitulos.vtt"
kind="subtitles"
srclang="es"
label="Español"
oncuechange="manejarCambioCue(event)"
>
</video>
Con JavaScript (recomendado):
const video = document.querySelector('video');
const pista = video.querySelector('track');
pista.addEventListener('cuechange', (e) => {
const cueActivo = pista.track.activeCues[0];
// Acciones con el cue actual
});
Ejemplos prácticos
Ejemplo 1: Mostrar subtítulos personalizados
<video id="miVideo" controls>
<source src="video.mp4" type="video/mp4">
<track
id="subtitulos"
src="subtitulos.vtt"
kind="subtitles"
default
>
</video>
<div id="subtituloPersonalizado"></div>
<script>
const video = document.getElementById('miVideo');
const pista = video.querySelector('#subtitulos');
pista.oncuechange = () => {
const cueActual = pista.track.activeCues[0];
if (cueActual) {
document.getElementById('subtituloPersonalizado').textContent = cueActual.text;
}
};
</script>
Ejemplo 2: Cuestionario interactivo sincronizado
<video id="tutorial" controls>
<source src="leccion.mp4" type="video/mp4">
<track
src="preguntas.vtt"
kind="metadata"
oncuechange="mostrarPregunta(event)"
>
</video>
<div id="pregunta" hidden></div>
<script>
function mostrarPregunta(e) {
const cue = e.target.track.activeCues[0];
if (cue && cue.text.startsWith('PREGUNTA:')) {
const pregunta = cue.text.split(':')[1];
document.getElementById('pregunta').textContent = pregunta;
document.getElementById('pregunta').hidden = false;
} else {
document.getElementById('pregunta').hidden = true;
}
}
</script>
Propiedades clave de los cues
Accede a datos útiles desde el objeto cue:
-
text: Contenido textual del cue. -
startTime: Momento de inicio (en segundos). -
endTime: Momento de finalización. -
id: Identificador único del cue.
pista.addEventListener('cuechange', () => {
const cue = pista.track.activeCues[0];
console.log(`Cue actual: ${cue.text} (${cue.startTime}-${cue.endTime}s)`);
});
Diferencias clave: oncuechange vs eventos multimedia
| Evento | Descripción |
|---|---|
oncuechange |
Cambio en cues activos de una pista de texto |
ontimeupdate |
Actualización general del tiempo de reproducción |
onplay |
Al iniciar la reproducción |
Mejores prácticas
Formato WebVTT válido:
Asegúrate de que el archivo .vtt esté bien estructurado:
WEBVTT 00:00:03.000 --> 00:00:06.000 Este es un cue de ejemplo.
Manejo de múltiples pistas:
const pistas = video.textTracks;
pistas[0].oncuechange = () => { /*...*/ }; // Pista 0
Accesibilidad:
-
Usa
kind="subtitles"para subtítulos estándar. -
Proporciona controles para activar/desactivar pistas.
Casos avanzados
Sincronización con animaciones CSS:
<video id="videoAnimado" controls>
<source src="animacion.mp4" type="video/mp4">
<track
src="animacion.vtt"
kind="metadata"
oncuechange="manejarAnimacion(event)"
>
</video>
<div id="elementoAnimado"></div>
<script>
function manejarAnimacion(e) {
const cue = e.target.track.activeCues[0];
if (cue && cue.text === 'animar') {
document.getElementById('elementoAnimado').classList.add('animar');
} else {
document.getElementById('elementoAnimado').classList.remove('animar');
}
}
</script>
<style>
.animar {
animation: destacar 1s;
}
</style>
Integración con APIs externas:
pista.addEventListener('cuechange', async () => {
const cue = pista.track.activeCues[0];
if (cue.text.startsWith('TRADUCIR:')) {
const texto = cue.text.split(':')[1];
const traduccion = await traducirTexto(texto, 'en');
mostrarTraduccion(traduccion);
}
});
Errores comunes
<!-- MAL: Pista no cargada o con errores --> <track src="ruta-incorrecta.vtt"> <!-- El evento no se disparará --> <!-- CONFUSIÓN: Usar en elementos sin pistas --> <audio oncuechange="..."></audio> <!-- Requiere elemento <track> --> <!-- OLVIDAR el atributo default en pistas múltiples --> <track src="subtitulos.vtt" kind="subtitles"> <!-- Puede no activarse -->
Compatibilidad
| Navegador | Soporte | Notas |
|---|---|---|
| Chrome | ✅ Sí (v. 18+) | |
| Firefox | ✅ Sí (v. 31+) | |
| Safari | ✅ Sí | |
| Edge | ✅ Sí (v. 12+) | |
| Móviles | ✅ Sí (iOS/Android) |
Conclusión
El atributo oncuechange es ideal para:
- Sincronizar contenido interactivo con momentos específicos de un video.
- Crear experiencias educativas con cuestionarios integrados.
- Mejorar la accesibilidad mediante subtítulos dinámicos.
Recuerda:
- Usa archivos WebVTT bien formateados.
- Combina con otras APIs multimedia para experiencias ricas.
- Prueba en múltiples navegadores.
¡Ahora puedes crear aplicaciones multimedia interactivas y profesionales!