最近需要下载一些视频,数量不算多,百十个,动态加载比较多,写爬虫比较麻烦,想想不如直接做个书签JS直接点点鼠标下载了。
第一个:直接打开链接
javascript:(function() {var uri_enc = document.getElementsByClassName("xxx")[0].src;window.open(uri_enc);}) ();
但是这样文件名是默认文件名,
于是第二个:创建一个a标签,然后点击。
javascript:(function() {var url = document.getElementsByClassName("url")[0].src; const a = document.createElement("a"); a.href = url; a.download = document.getElementsByClassName("name")[0].innerText.split(":",)[1]; a.name=document.getElementsByClassName("name")[0].innerText.split(":",)[1]; a.click(); a.remove(); })();
但是对于PDF、视频是无效的,浏览器会直接浏览而不是默认下载。
想想还是改进下第一个方案。
从页面提取想要的字符串做文件名
第三版:
javascript:(function() { var elm = document.createElement('textarea'); var str= document.getElementsByClassName("name")[0].innerText.split(":",)[1]; elm.value = str; document.body.appendChild(elm); elm.select(); document.execCommand('copy'); document.body.removeChild(elm); var uri_enc = document.getElementsByClassName("url")[0].src; window.open(uri_enc); }) ();
但是要多操作两次键盘,于是想通过获取blob来实现下载视频
第四版:
javascript:(function (){ var url=document.getElementsByClassName("url")[0].src; var name=document.getElementsByClassName("name")[0].innerText.split(":",)[1]; fetch(url) .then(res => res.blob()) .then(blob => { const a = document.createElement("a"); const objectUrl = window.URL.createObjectURL(blob); a.download = name; a.href = objectUrl; a.click(); window.URL.revokeObjectURL(objectUrl); a.remove(); }) }) ();
但是实际使用效果有些差,fetch要全部缓存下来才显示下载窗口。等待时间过长了,不如用第三版多操作两下,可以达到类似多线程的效果。
标签:文件,name,elm,url,getElementsByClassName,JS,var,document,下载 From: https://www.cnblogs.com/instr/p/17118527.html