精彩动人!这个事件才会触发加载!原来HTMLVideoElement还有“小心机”!
2023-12-12 21:45:41
说起HTML5,我们总能联系到媒体资源和多媒体内容。从<audio>
标签到<video>
标签,它们总能提供最好的媒体体验。视频标签<video>
,更可以播放各种各样的视频格式,并提供各种控制功能,例如播放、暂停、快进、快退等。
然而,有一个非常容易被忽略的问题,那就是<video>
标签的load
事件会被浏览器拦截。这个拦截行为导致了load
事件无法在视频加载完成后触发,而是由loadstart
、canplay
和play
等其他事件代替。
为了证明这一点,我们可以进行一个简单的实验。首先,我们在<video>
标签中设置一个load
事件监听器,并输出一条消息。然后,我们再设置一个canplay
事件监听器,并输出另一条消息。最后,我们播放视频。
<video id="video" src="video.mp4">
<script>
const video = document.getElementById('video');
video.addEventListener('load', () => {
console.log('Load event triggered!');
});
video.addEventListener('canplay', () => {
console.log('Canplay event triggered!');
});
video.play();
</script>
</video>
实验结果表明,load
事件并没有触发,而是canplay
事件触发了。这表明,load
事件确实被浏览器拦截了。
那么,为什么浏览器会拦截load
事件呢?原来,load
事件不仅仅是针对视频加载,它还包括了视频解码和渲染的过程。由于视频解码和渲染是一个耗时的过程,浏览器为了提高性能,将load
事件拦截,并改用loadstart
、canplay
和play
等事件来表示视频加载的各个阶段。
虽然浏览器拦截了load
事件,但这并不意味着我们无法在视频加载完成后执行某些操作。我们可以使用canplay
或play
事件来替代load
事件。canplay
事件表示视频已经可以播放,但可能还没有完全加载。play
事件表示视频正在播放。
<video id="video" src="video.mp4">
<script>
const video = document.getElementById('video');
video.addEventListener('canplay', () => {
console.log('Video can be played!');
});
video.addEventListener('play', () => {
console.log('Video is playing!');
});
video.play();
</script>
</video>
实验结果表明,canplay
和play
事件都能够在视频加载完成后触发。因此,我们可以使用这些事件来替代load
事件,以在视频加载完成后执行某些操作。
除了canplay
和play
事件之外,我们还可以使用loadeddata
事件。loadeddata
事件表示视频的元数据已经加载完成,但视频可能还没有完全加载。
<video id="video" src="video.mp4">
<script>
const video = document.getElementById('video');
video.addEventListener('loadeddata', () => {
console.log('Video metadata loaded!');
});
video.play();
</script>
</video>
实验结果表明,loadeddata
事件也在视频加载完成后触发。因此,我们也可以使用loadeddata
事件来替代load
事件,以在视频加载完成后执行某些操作。
通过本文的介绍,我们了解到HTMLVideoElement的load事件会被浏览器拦截,而是由loadstart、canplay和play等其他事件代替。我们还可以使用canplay、play或loadeddata事件来替代load事件,以在视频加载完成后执行某些操作。