ใช้แอตทริบิวต์ oncanplay เพื่อดำเนินการสคริปต์เมื่อไฟล์สื่อ (Audio/Video) พร้อมที่จะเริ่มเล่นได้ ทำงานกับ <audio>, <video>, <embed>, <object>
ตัวอย่าง
<!DOCTYPE HTML>
<html>
<body>
<video width="300" height="200" controls oncanplay="onCanPlay()">
<source src="/html5/foo.ogg" type="video/ogg" />
<source src="/html5/foo.mp4" type="video/mp4" />
Your browser does not support the video element.
</video>
<script>
function onCanPlay() {
alert("I am ready to begin.");
// หรือ console.log, update UI, enable buttons, etc.
}
</script>
</body>
</html>
Media Events ลำดับการโหลด
loadstart - เริ่มโหลด
durationchange - รู้ Duration แล้ว
loadedmetadata - โหลด Metadata เสร็จ (Duration, Dimensions)
loadeddata - โหลด Frame แรกเสร็จ
canplay - พร้อมเล่นได้ (มีข้อมูลพอเล่นต่อเนื่องสั้นๆ)
canplaythrough - โหลดพอเล่นจบโดยไม่ต้องหยุด Buffer
playing - กำลังเล่นจริง
ความแตกต่าง: canplay vs canplaythrough
| Event |
ความหมาย |
ใช้เมื่อไหร่ |
canplay |
มีข้อมูลพอเล่นเริ่มได้ แต่อาจต้อง Buffer ระหว่างทาง |
แสดง UI "Ready", เริ่มเล่นทันที (อาจ Buffer ภายหลัง) |
canplaythrough |
โหลดพอเล่นจบโดยไม่หยุด (ประมาณการ) |
Preload ให้เสร็จก่อนเล่น, Live streaming |
ตัวอย่าง: Custom Video Player Controls
<video id="player" src="video.mp4" preload="metadata"></video>
<div class="controls">
<button id="playBtn" disabled>Play</button>
<span id="duration">0:00</span>
</div>
<script>
const video = document.getElementById('player');
const playBtn = document.getElementById('playBtn');
const durationEl = document.getElementById('duration');
video.addEventListener('loadedmetadata', () => {
durationEl.textContent = formatTime(video.duration);
});
video.addEventListener('canplay', () => {
playBtn.disabled = false;
playBtn.textContent = 'Play';
});
video.addEventListener('play', () => playBtn.textContent = 'Pause');
video.addEventListener('pause', () => playBtn.textContent = 'Play');
video.addEventListener('timeupdate', () => {
// Update progress bar
});
playBtn.addEventListener('click', () => {
video.paused ? video.play() : video.pause();
});
function formatTime(seconds) {
const m = Math.floor(seconds / 60);
const s = Math.floor(seconds % 60).toString().padStart(2, '0');
return `${m}:${s}`;
}
</script>
Event Attributes อื่นๆ ของ Media
| Event |
Description |
onplay | เริ่มเล่น |
onpause | หยุดชั่วคราว |
onended | เล่นจบ |
ontimeupdate | เวลาเล่นเปลี่ยน (Update progress bar) |
onvolumechange | ระดับเสียงเปลี่ยน |
onratechange | ความเร็วเล่นเปลี่ยน |
onseeking / onseeked | กำลัง Seek / Seek เสร็จ |
onwaiting | รอ Buffer |
onerror | เกิดข้อผิดพลาด |