数据导出js监听

由于导出数据时间太长用户的体验和用户的耐心全部消耗殆尽。于是领导说让我配合前端弄出个loading。ps:说好的特效那。
由于导出直接访问的是url 于是我想到了ajax 异步请求。于是我开始尝试用异步请求做了我的第一次尝试。跟随者度娘的协助我明白了这种方式的伪原理。先请求数据将数据转成base64 放入页面中一个隐藏的a标签的href中。然后用js 触发a的点击。可是数据太大会直接下载失败。
之后经过查找资料后了解用iframe 标签来做下载。在下载的事件触发让iframe加载下载的页面。但是问题又来了 下载的页面生成文件后就会消失。用加载完成事件显然不能够成功的监听下载过程。
于是乎我陷入了一个难题。该如何成功监听下载那。
后来在查找资料中得到了一个思路。cookie
让后台完成时候生成一个标识cookie
而前面从事件触发开始做个定时任务。没过一秒执行一次查询cookie 如果存在。关掉循环。这样我们就成功的监听了。
剩下的上马

html 中加载

<iframe id="ifile" style="display:none"></iframe>

js


/**
 * 定时任务 常量
 */
var downloadfileInterval;
/**
 * 任务锁。 防止重复点击
 * @type {boolean}
 */
var downloadfileIntervalBoolen = true;

/**
 * 数据导出
 */
function downloadfile(type) {
    //判断是否开启任务锁定
    if (downloadfileIntervalBoolen) {
        //开启 loading
        $("#loading_pic").css("display","block");
        //锁住 任务
        downloadfileIntervalBoolen=false;
        //在iframe 中下载
        $("#ifile").attr("src", "/pc/" + type + "/excelExport");
        // 开启执行定时任务
        downloadfileInterval = window.setInterval(getDownloadState, 1000);
    }else{
        $.gritter.add({
            title: '',
            text: '文件正在下载中。',
            class_name: 'gritter-error'
        });
    }
}


function getDownloadState() {

    var downloadState = $.cookie("downloadState");
    // 判断是否存在 downloadState的值
    if (downloadState && downloadState != "null") {
        if (downloadState == "success") {
            $.gritter.add({
                title: '成功',
                text: '下载成功。',
                class_name: 'gritter-success'
            });

        } else if (downloadState == "notDownload") {
            $.gritter.add({
                title: '',
                text: '下载任务正在执行中请保持淡定等候。',
                class_name: 'gritter-error'
            });
        } else if (downloadState == "error") {
            $.gritter.add({
                title: '',
                text: '下载异常请稍后重试。',
                class_name: 'gritter-error'
            });
        }
        //关闭任务锁
        downloadfileIntervalBoolen=true;
        //关闭 loading
        $("#loading_pic").css("display","none");
        //关闭定时任务
        window.clearInterval(downloadfileInterval);
    }
}
$(function(){
	//监听是否刷新或者关闭页面
    window.onbeforeunload = function (e) {
    //用任务锁的状态 判断一下任务是否存在
        if (!downloadfileIntervalBoolen) {
        //存在任务锁死 询问是否要关闭页面
            var e = window.event || e;
            e.returnValue = ("导出文件正在下载中,关闭页面将会取消下载。是否要取消下载?");
        }
    }
})
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值