web程序下载文件添加等待加载效果

首先要搞清楚出现等待加载效果的时间是在哪里。

如果是固定的文件,只要一个超链接指定到该文件,就可以立即下载了,这个根本不需要什么等待效果。

这里讨论的是动态生成的文件的下载。

第一步,在服务器上搜索数据;

第二步:把数据放到一个文件中;

第三步:把文件随response返回。

第三步,如果文件大的话,下载进度是可以在浏览器里看到的,所以这里不需要等待效果。

需要等待效果的是,用户点击按钮,却看不到页面有什么反应,于是用户会连续点击下载按钮,无谓地增加服务器的负载。

因此,需要有等待效果的是第一步和第二步,也就是文件在生成过程中,服务器在拼命工作而客户端却看不到的这段时间。

那么如何实现呢?

先说几种不妥的办法:

1、form表单提交:

这种办法下载是没有问题的,可是不方便把上述三个步骤区分开来,也就不好掌握开始等待效果和结束效果的时机,所以这个不好。

2、ajax提交:

这个更不好,因为单纯的ajax连下载都无法完成,ajax是没有办法操作硬盘空间的,下载就别想了。


再说两种可以实现的方法:

1、两次请求(推荐)

就是先请求一次,让服务器生成文件,这段时间一直是等待的。

等文件生成之后,返回给请求告诉它文件生成的具体位置,再去请求文件。去掉等待效果。

这样,每次下载都要请求再次,稍有点繁琐,但是不受到浏览器的限制,还是不错的。

2、iframe实现下载等待

用iframe实现下载等待的原理是把下载的路径给iframe的src,然后监听iframe的onload事件,当后台处理完成并返回文件时,会触发iframe的onload事件。使用该方法有两个问题:
参数通过url传递,如果url长度超过2048会被浏览器截断。
iframe的onload事件在ie浏览器下触发不符合要求。

[html]  view plain  copy
  1. <!DOCTYPE html>  
  2. <html lang="zh">  
  3.   
  4. <head>  
  5.     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />  
  6.     <script type="text/javascript" src="http://cdn.bootcss.com/jquery/1.11.3/jquery.min.js"></script>  
  7. <span style="white-space:pre">    </span><script type="text/javascript" src="http://cdn.bootcss.com/jquery.blockUI/2.66.0-2013.10.09/jquery.blockUI.min.js"></script>  
  8.     <title>文件下载等待</title>  
  9. </head>  
  10.   
  11. <body>  
  12.     <button id="btnDownload">文件下载</button>    
  13.     <!--  
  14.         下载的iframe  
  15.         通过iframe的onload事件判断后台是否已经导出完成,浏览器是否开始下载  
  16.     -->  
  17.     <iframe id="iframeDownload" style="display:none;"></iframe>  
  18.       
  19.     <script type="text/javascript">         
  20.         $(function(){  
  21.             $('#iframeDownload').on('load', function(){  
  22.                 //当后台返回文件时,取消Loading。  
  23.                 $.unblockUI();  
  24.                 return false;  
  25.             });  
  26.               
  27.             $('#btnDownload').click(function(){  
  28.                 var url = 'https://codeload.github.com/mugifly/jquery-simple-datetimepicker/legacy.zip/1.12.0';  
  29.                 download(url, '下载中,请稍候。。。');  
  30.                 return false;  
  31.             });  
  32.         });  
  33.           
  34.         /**  
  35.          * 下载  
  36.          * @param  url      {String}  [必填]下载文件的路径,如果有参数,请通过url传值,如download.jsp?year=2015&month=7  
  37.          * @param  message  {String}  [可选]等待文字,默认是请稍候  
  38.          */  
  39.         function download(url, message){              
  40.             //如果message没有值或者不是字符串,使用默认等待文字。  
  41.             if(!message || Object.prototype.toString.call(message) !== '[object String]'){  
  42.                 message = '请稍候。。。';  
  43.             }  
  44.               
  45.             //显示等待效果  
  46.             $.blockUI({  
  47.                 message: message  
  48.             });  
  49.               
  50.             //让iframe的src调用url  
  51.             $('#iframeDownload').attr('src', url);  
  52.         }  
  53.     </script>  
  54. </body>  
  55.   
  56. </html>  

上面的方法通过url传递参数,参数如果超过长度,则会被截断。可以通过form和iframe组合的方式解决,因为form通过post提交,不受参数大小的限制。具体思路是把需要提交的参数通过input放到form里面去,通过form的action动态指定下载文件的url,form的target指向iframe使得服务器的结果返回到iframe中,这样就能够触发iframe的onload事件。这个方法也存在ie下的兼容性问题。
[html]  view plain  copy
  1. <!DOCTYPE html>  
  2. <html lang="zh">  
  3.   
  4. <head>  
  5.     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />  
  6.     <script type="text/javascript" src="http://cdn.bootcss.com/jquery/1.11.3/jquery.min.js"></script>  
  7.     <script type="text/javascript" src="http://cdn.bootcss.com/jquery.blockUI/2.66.0-2013.10.09/jquery.blockUI.min.js"></script>  
  8.     <title>文件下载等待</title>  
  9. </head>  
  10.   
  11. <body>  
  12.     <button id="btnDownload">文件下载</button>    
  13.     <!-- 
  14.         通过form提交参数,把服务器返回的结果在iframe中显示 
  15.     -->  
  16.     <form id="formDownload" method="post" target="downloadTarget" style="display:none;">  
  17.         <iframe id="iframeDownload" name="downloadTarget"></iframe>  
  18.         <div class="form-params">  
  19.             <!-- 提交到后台的参数,如果有多个参数,可以用多个hidden -->  
  20.             <input type="hidden" name="param" value="" />  
  21.         </div>  
  22.     </form>  
  23.       
  24.     <script type="text/javascript">         
  25.         $(function(){  
  26.             $('#iframeDownload').on('load', function(){  
  27.                 //当后台返回文件时,取消Loading。  
  28.                 $.unblockUI();  
  29.                 return false;  
  30.             });  
  31.               
  32.             $('#btnDownload').click(function(){  
  33.                 var url = 'https://codeload.github.com/mugifly/jquery-simple-datetimepicker/legacy.zip/1.12.0';  
  34.                 download(url, [  
  35.                     {  
  36.                         name: 'time',  
  37.                         value: new Date().getTime()  
  38.                     },  
  39.                     {  
  40.                         name: 'year',  
  41.                         value: new Date().getFullYear()  
  42.                     }  
  43.                 ], '下载中,请稍候。。。');  
  44.                 return false;  
  45.             });  
  46.         });  
  47.           
  48.         /**  
  49.          * 下载  
  50.          * @param  url      {String}  [必填]下载文件的路径          
  51.          * @param  params   {Object}  [可选]提交到后台的参数,如[{name:'year',value:2015},{name:'month',value:7}]  
  52.          * @param  message  {String}  [可选]等待文字,默认是请稍候  
  53.          */  
  54.         function download(url, params, message){  
  55.             //如果message没有值或者不是字符串,使用默认等待文字。  
  56.             if(!message || Object.prototype.toString.call(message) !== '[object String]'){  
  57.                 message = '请稍候。。。';  
  58.             }  
  59.               
  60.             //显示等待效果  
  61.             $.blockUI({  
  62.                 message: message  
  63.             });  
  64.               
  65.             var $form = $('#formDownload');  
  66.               
  67.             //更换form的请求路径  
  68.             $form.attr('action', url);  
  69.               
  70.             //把form下的全部参数去掉  
  71.             $form.children('.form-params').remove();  
  72.               
  73.             var k, $params, $input;  
  74.             if(Object.prototype.toString.call(params) === '[object Array]'){  
  75.                 //把新的参数添加到form下以便提交  
  76.                 $params = $('<div class="form-params"></div>');  
  77.                 $form.append($params);  
  78.                   
  79.                 $.each(params, function(i, v){  
  80.                     //创建隐藏的input  
  81.                     $input = $('<input type="hidden" name="' + v.name + '" />');  
  82.                     $input.val(v.value);  
  83.                     $params.append($input);  
  84.                 });  
  85.             }  
  86.               
  87.             //提交请求  
  88.             $form.submit();  
  89.         }  
  90.     </script>  
  91. </body>  
  92.   
  93. </html>  

不知道还有没有好的办法,请展示一下。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值