本文最后更新于:2020年12月25日 上午
场景
客户需要一次性将视频全部缓冲完成再进行观看而非看一段缓冲一段,所以就看了一下有没有什么方法能够做到,结果顺便还写了一个通用的加载资源的方法。
实现
基本思路是使用 ajax
(fetch
) 将资源先加载到本地,然后生成一个本地的 url,最后将本地资源链接赋值给需要资源的元素上。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
|
function loadResource(url, domSelector, init) { if (!init) { init = {} } if (init.before && typeof init.before === 'function') { init.before() } init.cache = init.cache || 'force-cache' init.error = init.error || ((error) => console.log(`request was wrong: ${error}`)) fetch(url, init) .then((rep) => { if (rep.status === 200) { return rep } else { throw new Error(`response status error ${rep.status}`) } }) .then((data) => data.blob()) .then((blob) => { domSelector.src = window.URL.createObjectURL(blob) if (init.after && typeof init.after === 'function') { init.after() } }) .catch(init.error) }
|
使用示例
假如有一个 video
元素需要加载视频
1
| <video id="video" controls></video>
|
那么使用该方法的 JavaScript
代码就是
1 2 3 4 5 6 7 8 9 10 11 12 13
| var url = '/html/testVideo.m4'
var video = document.querySelector('#video')
loadResource(url, video, { before: () => console.log('video load before'), after: () => console.log('video load after'), error: (error) => console.log(`video load error: ${error}`), })
loadResource(url, video)
|
注:此方法不仅可以加载视频,也可以加载 audio, img 等拥有 src 属性的二进制资源
这个方法同样也已经丢到了 GitHub Gist 上面啦