惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

H
Help Net Security
博客园 - Franky
GbyAI
GbyAI
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
爱范儿
爱范儿
IT之家
IT之家
酷 壳 – CoolShell
酷 壳 – CoolShell
aimingoo的专栏
aimingoo的专栏
博客园_首页
MongoDB | Blog
MongoDB | Blog
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
Recent Announcements
Recent Announcements
Scott Helme
Scott Helme
有赞技术团队
有赞技术团队
M
MIT News - Artificial intelligence
C
CERT Recently Published Vulnerability Notes
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
Jina AI
Jina AI
F
Fortinet All Blogs
N
Netflix TechBlog - Medium
L
LangChain Blog
L
LINUX DO - 最新话题
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
H
Hacker News: Front Page
MyScale Blog
MyScale Blog
P
Palo Alto Networks Blog
G
Google Developers Blog
Google DeepMind News
Google DeepMind News
AI
AI
T
Troy Hunt's Blog
Microsoft Azure Blog
Microsoft Azure Blog
阮一峰的网络日志
阮一峰的网络日志
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
Vercel News
Vercel News
Microsoft Security Blog
Microsoft Security Blog
罗磊的独立博客
S
Secure Thoughts
大猫的无限游戏
大猫的无限游戏
博客园 - 叶小钗
人人都是产品经理
人人都是产品经理
Blog — PlanetScale
Blog — PlanetScale
博客园 - 司徒正美
Apple Machine Learning Research
Apple Machine Learning Research
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
博客园 - 三生石上(FineUI控件)
S
Security @ Cisco Blogs
Cloudbric
Cloudbric
E
Exploit-DB.com RSS Feed
Attack and Defense Labs
Attack and Defense Labs

博客园 - Kriss Liu

绕开 CoreLab.MySql 验证 如何通过活动目录(ADSI)修改IIS6中的 Web 服务扩展 XMLDOM/XMLHTTP的跨域访问和页面代理 Remoting中的线程与网络通信内幕初探 Remoting多个信道(Chennel)的注册问题 基于强名称签名的代码访问保护及其改进 利用命名管道(Named Pipe)向Flash Player模拟Flash媒体文件 多样、互动的WinForm UI设计与开发思路(Flash、Html等) WinForm中设计时与DesignMode的区别 ServU插件设计 如何在C#中直接操作C++结构体 .NET中Flags枚举的使用 最近的计划。。VOS和DataSetBrowser。。 看完《仙剑奇侠传》前20集的一点牢骚。。 一套可嵌入或独立使用的翻页控件: WebPager(附源码) ASP.NET 2.0 中创建DataList子类控件时的一个错误 在.NET中使用DirectMusic 我与电脑的十年 关于 Windows Media DRM 0xC00D2840 错误
关于如何让页面同时下载多个文件的尝试 - Kriss Liu - 博客园
Kriss Liu · 2006-02-23 · via 博客园 - Kriss Liu

  朋友的项目里有这样一个要求,一个按钮按下后,同时出现四个csv文件下载。我们当然可以用window.open()打开4个新窗口来下载,但一下载蹦出很多页面,客户可能就不喜欢了。我本来想,那用隐藏的IFrame不就没问题了,事实没有这么简单。我们看一下如下的代码:

    <script language="javascript">
     function download(){
         document.all.frmHid1.src = "";
         document.all.frmHid1.src = "File.aspx?id=1";
         document.all.frmHid2.src = "";
         document.all.frmHid2.src = "File.aspx?id=2";
    }
    </script>
    <input type="button" id="btnDownload1" value="Click Me To Download" onclick="download();"/>
    <iframe id="frmHid1" frameborder="no" src="" width="0" height="0"></iframe>
    <iframe id="frmHid2" frameborder="no" src="" width="0" height="0"></iframe>

  这里为了避免用同一个IFrame必须一个一个下,而且还要判断frame.readyState,使用了多个IFrame。本以为这样就可以多个下载窗口同时弹出来了,不过实际运行起来,却一直只能弹出一个下载窗口。而且还是随机的,可能是 File1,也可能是 File2。中间我还尝试了很多其它的方法,不过都是这个样子。我猜想这可能是因为每个页面窗体(window)同一时间只允许一个下载确认窗体,而这个窗体是模式窗口。用window.open()因为是开辟了多个新的页面窗体,所以不存在这个问题。这样如果我们执意不弹出新窗口,而非要使用IFrame的话,要同时蹦出多个下载窗口是不可能了。

  那我们退而求其次,就让下载完一个文件后,再蹦出下一个吧。但这里又有一个问题,我们用普通的frame.readyState来判断一个文件是否下载完(确切说是下载确认窗体关闭),是做不到的。所以经过研究,我目前找到一种方法可以判断这个下载确认窗体的状态,那就是通过页面的焦点离开或者焦点得到的事件。

  具体的实现大家看一下下面的演示代码就可以了。如果谁有其他的好的实现方法,欢迎和我交流:)
====================Main.aspx===========================
<html>
<head>
    <script language="javascript">
   
    // 用于标记下载状态,'0'为初始值, '1' 为准备开始下载, '2' 为窗口焦点已离开,即下载窗口已弹出
    var downloadStatus = 0;
    var downloadIndex = 0;  // 当前下载文件索引
    var downloadCount = 2;  // 总下载文件数
   
    window.onblur = function(){  // 如果状态标志是'准备开始下载',可以理解为因为下载窗口弹出而失去焦点
        if ( downloadStatus == 1 )
            downloadStatus = 2;  // 下载窗口弹出状态
    }
    
    window.onfocus = function(){  
        // 得到焦点时,如果状态标志是'下载窗口弹出',可以理解为下载窗口关闭后重新得到焦点
        // 此时如果还有没下载的,继续下载下一个文件
        if ( downloadStatus == 2 && downloadIndex < downloadCount - 1 ) {
            download(downloadIndex+1); // 继续下载下一个
        } else if (downloadIndex == downloadCount-1) { // 全部文件已下载,恢复状态
            downloadStatus = 0;
            downloadIndex = 0;
       }
    }
   
    function download(index){
       downloadStatus = 1;
       downloadIndex = index;
   
       document.all.frmHid.src = "";
       document.all.frmHid.src = "File.aspx?id=" + index;
    }
    </script>
</head>
<body>
   Multy Download Sample<br />
   <br />
    <input type="button" id="btnDownload" value="Click Me To Download" onclick="download(0);"/>
    <iframe id="frmHid" frameborder="no" src="" width="0" height="0"></iframe>
</body>
</html>

====================File.aspx===========================
<%@ Page Language="VB" %>
<script runat="server">
 Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs)
  Dim id As String = Request.QueryString("id")
  
  Response.Clear()
  Response.ContentType = "text/plain"
  Response.AppendHeader("Content-Disposition", "attachment; filename=TestFile" & id & ".txt")
  Response.Write("You requested " & id)
  Response.End()
 End Sub
</script>