html - 禁用下载链接(使用 HTML5 下载属性)直到下载完成
问题描述
我有一个网站,其中包含以下 HTML 链接:
<a href="/api/admin_csv_dl" download="adminCSV.csv">Download CSV</a>
这可行,但我使用的 API 需要一段时间才能生成 .csv 文件,因此在单击按钮和开始下载之间存在延迟。我想禁用链接直到下载完成,或者至少直到它开始(因为下载本身相对没有时间)然后重新启用它,但我不知道如何“公开”那个使用 HTML5 下载属性时的信息。
如果我使用 ajax 之类的东西来点击 API,我会在单击链接后立即禁用该链接,并在获得成功响应后重新启用它,但 HTML5 下载属性对于我的用例来说非常漂亮,除了我不知道如何更仔细地检查这个过程。
解决方案
只是一个想法,您可以保持 <a> 与现在相同,但将其隐藏,以便仅用于其功能,但不直接与用户交互。然后你可以有一个按钮或其他东西,你可以用它来“点击” <a> 当它被点击并禁用按钮,但没有办法知道下载何时完成,所以你可以设置一个超时或在对下载该项目需要多长时间进行一些测试之后。这是非常骇人听闻的,因为显然下载时间会根据用户的互联网速度而有很大差异。这可能看起来像这样:
const downloadBtn = document.getElementById('download-btn');
downloadBtn.addEventListener("click", function(event){
event.preventDefault();
// trigger download through hidden link
document.getElementById('download-link').click();
document.getItemById("btn").disabled = false;
setTimeout(
function(){ document.getItemById("btn").disabled = true; }, 3000);
}
<button id="download-btn">Download</button>
<a id="download-link" href="/api/admin_csv_dl" download="adminCSV.csv" hidden>Download CSV</a>
话虽如此,如果在下载期间禁用链接/按钮非常重要,我会选择完全以编程方式执行此操作。如果你走这条路,我会使用浏览器的downloads
api 来研究一些东西。更多信息可以在这里找到。祝你好运!
推荐阅读
- excel - 使用名称中带有“/”的 VBA 保存 excel 工作簿
- php - PHP用锚标记替换字符串中的URL
- c# - 无法检查 WinAppDriver 中的 Grids/StackPanels/Custom Controls 并通过 Appium 的 AccessibilityId 找到它们
- flutter - 具有标记人员功能的 Flutter TextField
- swift5 - 当我单击 UISearchController Swift 5 时,我的应用程序停止运行
- go - 用于服务间通信的基于 gRPC 的微服务架构
- javascript - 将函数 prop 传递给子组件(通过 Link 和 Route 组件)
- xamarin.forms - 如何在 Xamarin iOS 和 Android 在管道中构建任务之前替换 json 配置值
- python - 将二维向量多次添加到另一个二维向量的有效方法
- angular - 已选择 Angular 自动完成输入并模糊事件竞争条件