我如何鼓励浏览器缓存 HTML5 <video> 海报图像?

How can I encourage the browser to cache the HTML5 <video> poster image?

我有一个网页,网页上嵌入了一系列视频:

<video controls preload="metadata" poster="/path/to/video1/poster-image-1.jpg">
<video controls preload="metadata" poster="/path/to/video2/poster-image-2.jpg">
<video controls preload="metadata" poster="/path/to/video3/poster-image-3.jpg">

添加视频后,页面加载速度变慢了很多,所以我开始尝试确定瓶颈。

Firefox Developer Tools 上的 Network 选项卡显示每个 poster 图像都返回 206 Partial Contentposter 图片总是从服务器下载,从不从本地浏览器缓存下载 - 正是这个原因使页面速度减慢 2-3 秒。

如何确保 <video> poster 图像是从本地浏览器缓存中检索的?


是在页面其他地方有一系列不可见图像的唯一解决方案,如下所示:

.preload {width: 1px; height: 1px; opacity: 0;}

<img class="preload" src="/path/to/video1/poster-image-1.jpg" alt="" />
<img class="preload" src="/path/to/video2/poster-image-2.jpg" alt="" />
<img class="preload" src="/path/to/video3/poster-image-3.jpg" alt="" />

我找不到缓存 poster 属性图像的方法,所以我尝试删除所有 poster 属性。

然后我发现即使没有 posterpreload="metadata" 属性仍然会显着减慢页面加载时间。

所以,最终,我用 preload="none" 替换了 preload="metadata" 并编写了一个简短的脚本,在页面后几秒钟将 poster 属性异步添加到 DOM 中已完成加载:

function asyncVideo() {
    var videos = document.getElementsByTagName('video');

    for (var i = 0; i < videos.length; i++) {
        var posterSrc = videos[i].getElementsByTagName('source')[0].getAttribute('src');
        posterSrc = posterSrc.replace('.mp4', '.jpg');
        videos[i].poster = posterSrc;
    }
}

setTimeout(asyncVideo, 6000);