最简单的方法来打开一个下载窗口,而不用离开页面

什么是最好的跨浏览器的方式来打开一个下载对话框(让我们假设我们可以设置内容处理:在标题中的附件),而无需离开当前页面,或打开popup窗口,在IE6中不工作。

7年过去了,好的。 我不知道它是否适用于IE6,但是这会在FF和Chrome中提示OpenFileDialog。

var file_path = 'host/path/file.ext'; var a = document.createElement('A'); a.href = file_path; a.download = file_path.substr(file_path.lastIndexOf('/') + 1); document.body.appendChild(a); a.click(); document.body.removeChild(a); 

这个JavaScript很好,它不会打开一个新的窗口或选项卡。

 window.location.assign(url); 

我总是添加一个目标=“_ blank”到下载链接。 这将打开一个新窗口,但只要用户单击保存,新窗口closures。

把它放在HTML头部分,将url var设置为要下载的文件的URL:

 <script type="text/javascript"> function startDownload() { var url='http://server/folder/file.ext'; window.open(url, 'Download'); } </script> 

然后把它放在体内,5秒后自动开始下载:

 <script type="text/javascript"> setTimeout('startDownload()', 5000); //starts download after 5 seconds </script> 

(从这里 )

我一直在寻找一个很好的方法来使用JavaScript来启动一个文件的下载,就像这个问题所build议的一样。 但是这些答案没有帮助。 然后,我做了一些xbrowsertesting,发现一个iframe在所有现代浏览器IE> 8上效果最好。

 downloadUrl = "http://example.com/download/file.zip"; var downloadFrame = document.createElement("iframe"); downloadFrame.setAttribute('src',downloadUrl); downloadFrame.setAttribute('class',"screenReaderText"); document.body.appendChild(downloadFrame); 

class="screenReaderText"是我的类风格的内容,是目前,但无法查看。

CSS:

 .screenReaderText { border: 0; clip: rect(0 0 0 0); height: 1px; margin: -1px; overflow: hidden; padding: 0; position: absolute; width: 1px; } 

与html5boilerplate中的.visuallyHidden相同

我更喜欢这个JavaScript的window.open方法,因为如果链接被打破,iframe方法根本不做任何事情,而不是redirect到一个空白页面,说文件无法打开。

 window.open(downloadUrl, 'download_window', 'toolbar=0,location=no,directories=0,status=0,scrollbars=0,resizeable=0,width=1,height=1,top=0,left=0'); window.focus(); 

如果链接是有效的文件url,只需指定window.location.href即可。

但是,有时链接无效,并且需要一个iFrame。

做你的正常event.preventDefault,以防止窗口打开,如果你使用jQuery,这将工作:

 $('<iframe>').attr('src', downloadThing.attr('href')).appendTo('body').load(function() { $(this).remove(); }); 

我知道这个问题在7 years and 9 months ago被问过7 years and 9 months ago但是很多发布的解决scheme似乎并不奏效,例如使用<iframe>只能用于FireFox并且不适用于Chrome

最佳解决scheme

JavaScript打开文件下载popup窗口的最佳工作解决scheme是使用HTML链接元素, 而不需要将link元素附加到document.body如其他答案中所述。

您可以使用以下function:

 function downloadFile(filePath){ var link=document.createElement('a'); link.href = filePath; link.download = filePath.substr(filePath.lastIndexOf('/') + 1); link.click(); } 

在我的应用程序中,我使用这种方式:

 downloadFile('report/xls/myCustomReport.xlsx'); 

工作演示:

 function downloadFile(filePath) { var link = document.createElement('a'); link.href = filePath; link.download = filePath.substr(filePath.lastIndexOf('/') + 1); link.click(); } downloadFile("http://www.adobe.com/content/dam/Adobe/en/accessibility/pdfs/accessing-pdf-sr.pdf"); 

怎么样:

 <meta http-equiv="refresh" content="5;url=http://site.com/file.ext"> 

这种方式适用于所有的浏览器(我想),并让你把一个消息,如:“如果下载没有启动在五秒钟内,请点击这里。

如果你需要它与JavaScript ..以及…

 document.write('<meta http-equiv="refresh" content="5;url=http://site.com/file.ext">'); 

问候

一个小/隐藏的iframe可以用于这个目的。

这样你就不必担心closurespopup窗口。

修改窗口的位置可能会导致一些问题,特别是当你有像websocket一样的持久连接时。 所以我总是诉诸于老的iframe解决scheme。

HTML

 <input type="button" onclick="downloadButtonClicked()" value="Download"/> ... ... ... <iframe style="display:none;" name="hiddenIframe" id="hiddenIframe"></iframe> 

使用Javascript

 function downloadButtonClicked() { // Simulate a link click var url = 'your_download_url_here'; var elem = document.createElement('a'); elem.href = url; elem.target = 'hiddenIframe'; elem.click(); }