我尝试使用此解决方案:
- 向页面添加不可见的 iframe
- 使用 target 属性让表单发布到 iframe
- 使用 iframe 的 onLoad 事件(由表单帖子触发)重置我的按钮
这适用于 Firefox,但当服务器响应是文件时,不会在 Chrome 中触发 onLoad 事件。
我选择的解决方案使用 cookie 并适用于所有浏览器:
- 当用户单击下载按钮时,将一个隐藏字段添加到包含随机值的表单中。
- 在服务器上,查找包含随机值的表单字段并设置具有相同值的 cookie。cookie 将与下一个服务器响应一起设置,因此当下载开始时。
- 在客户端上,每隔一秒左右开始轮询 cookie 以查找步骤 1 中的随机值。
- 一旦客户端找到该值,重置按钮。
这是下载按钮的事件处理程序中的相关代码,它是#nonce
我放置随机值的隐藏字段:
var nonce = Math.random(); // generate random number
$("#nonce").val(nonce); // set number as field value
$("#downloadDataset").button('loading'); // set button to loading state
var downloadTimer = setInterval(function () { // start polling the cookies
if (document.cookie.indexOf(nonce) != -1) {
$("#downloadDataset").button('reset'); // reset button
clearInterval(downloadTimer); // stop polling the cookies
}
}, 1000); // check every 1000ms