JS如何批量下载复选框选中的ACF repeater字段文件
问题
我已经拿到复选框选中项对应的URL数组,格式为[url1,url2,url3],需要实现点击按钮后批量下载所有选中项对应文件的功能。
现有脚本已经可以正常收集复选框值并弹窗展示,但没法触发文件下载,原有代码如下:
function GetSelected() { // 初始化存储选中值的数组 var selected = new Array(); // 获取ACF字段组容器 var tbl = document.getElementById("acf-group_62bea885d8d59"); // 拿到容器内所有input复选框 var chks = tbl.getElementsByTagName("INPUT"); // 遍历把选中的复选框值存入数组 for (var i = 0; i < chks.length; i++) { if (chks[i].checked) { selected.push(chks[i].value); } } // 弹窗展示选中值 if (selected.length > 0) { alert("Selected values: " + selected.join(",")); } };
使用场景是WordPress后台post.php编辑页,需要下载ACF repeater文件类型字段存储的选中文件,目前只支持单文件下载,要实现选中文件的批量下载,相关界面参考:界面截图
解决方案
原有代码只完成了选中值收集,没有触发下载的逻辑,直接替换成下面的代码即可:
function GetSelected() { var selected = []; var tbl = document.getElementById("acf-group_62bea885d8d59"); var chks = tbl.getElementsByTagName("INPUT"); // 收集选中的文件URL for (var i = 0; i < chks.length; i++) { if (chks[i].type === 'checkbox' && chks[i].checked) { selected.push(chks[i].value); } } if (!selected.length) { alert("请先勾选需要下载的文件"); return; } // 逐个触发下载,加间隔避免被浏览器拦截多文件请求 selected.forEach(function(url, idx) { setTimeout(function() { var a = document.createElement('a'); a.href = url; // 加download属性强制触发下载,而非在新标签打开预览 a.download = ''; a.rel = 'noopener'; document.body.appendChild(a); a.click(); document.body.removeChild(a); }, idx * 300); }); alert("已触发" + selected.length + "个文件的下载,若浏览器弹出多文件下载拦截提示,请选择允许"); }
补充说明
- 代码里加了
chks[i].type === 'checkbox'判断,避免把容器里其他类型的input(比如隐藏域、文本框)误算进去 - 300毫秒的下载间隔可以根据实际需求调整,如果文件多、浏览器拦截概率高,可以改成500毫秒
- 要是文件存在OSS/COS这类第三方存储上,需要提前配置好跨域规则,否则
download属性会失效,点击后会变成打开文件预览而不是下载 - 要保证复选框的
value存的是文件的完整绝对URL,不要用相对路径,否则会出现404
内容的提问来源于stack exchange,提问作者Matt
相关产品推荐
相关产品推荐

