El Atributo ONCANPLAY

Es un evento de JavaScript que se activa cuando el navegador determina que un recurso multimedia tiene suficientes datos para comenzar a reproducirse, aunque no necesariamente para completarse sin pausas.
El atributo oncanplay es un evento de JavaScript que se activa cuando el navegador determina que un recurso multimedia (como audio o video) tiene suficientes datos para comenzar a reproducirse, aunque no necesariamente para completarse sin pausas. Es útil para mejorar la experiencia del usuario al interactuar con contenido multimedia.
¿Qué hace exactamente?
-
Disparador: Se activa cuando:
-
El navegador ha cargado suficientes datos para iniciar la reproducción.
-
La metadata del archivo (duración, dimensiones, etc.) está disponible.
-
-
Uso típico:
-
Habilitar controles de reproducción.
-
Mostrar mensajes de "listo para reproducir".
-
Iniciar reproducción automática (con restricciones).
-
Elementos compatibles
Funciona en elementos multimedia:
-
<video> -
<audio>
Sintaxis básica
Como atributo HTML:
<video src="video.mp4" oncanplay="manejarListoParaReproducir()" controls ></video>
Con JavaScript (recomendado):
const video = document.getElementById('miVideo');
video.addEventListener('canplay', function() {
console.log('El video puede comenzar a reproducirse');
});
Ejemplos prácticos
Ejemplo 1: Habilitar botón de reproducción
<video id="miVideo" src="video.mp4"></video>
<button id="btnPlay" disabled>Reproducir</button>
<script>
document.getElementById('miVideo').oncanplay = function() {
document.getElementById('btnPlay').disabled = false;
};
document.getElementById('btnPlay').addEventListener('click', function() {
document.getElementById('miVideo').play();
});
</script>
Ejemplo 2: Mostrar tiempo de duración
<video id="tutorial" src="tutorial.mp4" oncanplay="mostrarInfo()"></video>
<p id="duracion"></p>
<script>
function mostrarInfo() {
const video = document.getElementById('tutorial');
document.getElementById('duracion').textContent =
`Duración: ${Math.round(video.duration)} segundos`;
}
</script>
Ejemplo 3: Carga progresiva con feedback
<video id="video" controls>
<source src="presentacion.webm" type="video/webm">
</video>
<div id="carga">Cargando video...</div>
<script>
const video = document.getElementById('video');
const carga = document.getElementById('carga');
video.oncanplay = () => {
carga.style.display = 'none';
video.controls = true;
};
video.onwaiting = () => {
carga.style.display = 'block';
};
</script>
Diferencias clave entre eventos relacionados
| Evento | Descripción |
|---|---|
oncanplay |
Puede comenzar la reproducción (buffer mínimo) |
oncanplaythrough |
Puede reproducirse hasta el final sin pausas |
onloadeddata |
Primer frame está listo |
onprogress |
El navegador está cargando datos activamente |
Mejores prácticas
Precarga opcional:
<video preload="metadata" ...></video>
-
preload="none": No cargar hasta que el usuario interactúe. -
preload="metadata": Cargar solo metadatos. -
preload="auto": Carga completa (usa con cuidado).
Manejo de errores:
video.onerror = () => {
console.error('Error al cargar el video');
};
Accesibilidad:
-
Proveer subtítulos con
<track>. -
Incluir controles de teclado para reproducción.
Casos avanzados
Reproducción automática condicional:
video.addEventListener('canplay', () => {
if (video.autoplay && document.visibilityState === 'visible') {
video.play().catch(() => {
// Manejar políticas de autoplay bloqueadas
});
}
});
Calidad adaptable:
const fuentes = [
{ src: 'video-360p.mp4', res: 360 },
{ src: 'video-720p.mp4', res: 720 }
];
video.oncanplay = () => {
const anchoPantalla = window.innerWidth;
const mejorFuente = fuentes.reduce((prev, curr) =>
(curr.res <= anchoPantalla && curr.res > prev.res) ? curr : prev
);
if (video.src !== mejorFuente.src) {
video.src = mejorFuente.src;
video.load();
}
};
Errores comunes
<!-- MAL: Usar en elementos no multimedia --> <div oncanplay="..."></div> <!-- No funciona --> <!-- CONFUSIÓN: Esperar reproducción completa --> <video oncanplay="video.play()"></video> <!-- Se detendrá si el buffer se agota --> <!-- OLVIDAR restricciones de autoplay --> <script> video.oncanplay = () => video.play(); // Puede fallar en móviles </script>
Compatibilidad
| Navegador | Soporte |
|---|---|
| Chrome | ✅ Sí (v. 3+) |
| Firefox | ✅ Sí (v. 3.5+) |
| Safari | ✅ Sí |
| Edge | ✅ Sí |
| Móviles | ✅ Sí (con restricciones) |
Conclusión
El atributo oncanplay es esencial para:
- Mejorar la experiencia multimedia con feedback visual.
- Optimizar la reproducción según condiciones de red.
- Coordinar acciones con la disponibilidad del contenido.
Recuerda:
- Nunca asumas que la reproducción será continua.
- Combínalo con otros eventos (
onprogress,onended) para un manejo completo. - Respeta las políticas de autoplay de los navegadores.
¡Ahora puedes crear experiencias multimedia más fluidas y profesionales!