起因
之前的项目用的是bootstrap的tableExport导出,数据量小还可以,数据稍微一多导出时浏览器就会崩溃。于是换成后台导出,然后就遇到了如何关闭转圈加载样式(之前前端导出时只要在导出方法完成时关闭即可)这个问题。
问题的要点就是后台导出怎么来通知前台导出(下载)已经完成。
过程
网上搜索‘excel导出完成样式关闭’相关关键词结果较少,改成搜索‘excel导出进度条’相关关键词内容较多,网上分享的方法其中有一个利用到session做标志。然后想说用cookie做会不会好一点,因为我只是要一个弹出下载框后通知前台关闭样式的标志,不做进度条,而且这个标志也只是为了让页面好看一点没有太大的安全性问题。
解决思路
思路很简单,就是在后台加载好excel文件后在cookie中写入一个标志位,前端在请求后台时开启一个定时函数循环检查cookie中的标志位。
**
P.S. 敲代码过程中还遇到了一个很蠢的问题,就是setTimeout(check(),500)和setTimeout(“check()”,500)的区别(前端菜鸟),一开始用setTimeout(check(),500)在console中看到函数没有按照定时间隔失效,看了下网上setTimeout参数中有的带双引号有的不带就顺着查了一下区别,发现了问题原因。
**
代码
function exporDatat() {
// 开启 loading 效果
$.bootstrapLoading.start({ loadingTips: "正在导出,请不要关闭窗口" });
//请求后台获取下载地址
var url=downloadPath;
location.href = url;
//检测cookie关闭样式
check();
}
//检测方法
function check(){
if(getCookie("loadingFlag")){
//关闭加载样式
$.bootstrapLoading.end();
//设置cookie立即过期清除标志cookie
var date = new Date();
document.cookie = "loadingFlag=''; expires="+date.toGMTString()+" ; path=/";
}else{
//500ms检测一次,根据实际情况修改
setTimeout("check()",500);
}
}
//根据名称获取cookie,项目cookie数量多的话可以做优化
function getCookie(name){
var strcookie = document.cookie;//获取cookie字符串
var arrcookie = strcookie.split("; ");//分割
//遍历匹配
for ( var i = 0; i < arrcookie.length; i++) {
var arr = arrcookie[i].split("=");
if (arr[0] == name){
return arr[1];
}
}
return "";
}