下载二进制文件而不触发onb​​eforeunload

时间:2010-03-16 04:27:29

标签: javascript ajax download

我想在用户点击链接时为用户启动文件下载,但我有一个onbeforeunload处理程序,我不想在下载开始时调用它。要下载,我目前有一个<a>href设置为文件位置,但点击它会导致在Chrome中调用onbeforeunload(不过在FF中)。

我知道我可以设置一个私有标志并在onbeforeunload处理程序中检查,但有没有办法使用ajax开始下载?我仍然希望用户在下载文件时看到通常的对话框(打开/保存等)。

想法?

5 个答案:

答案 0 :(得分:11)

实现这一目标的最佳方法是构建iframe并从那里触发下载。

我在Chrome,IE6 +和Firefox中对此进行了测试,这种方法似乎适用于所有这些方法。

示例代码:

function DownloadFile(filePath) {
    var downloadIframe = $('<iframe />', 
        {
            id    :    'downloadIframe'        
        }).appendTo('body');
    downloadIframe.attr('src', filePath);
}

这只适用于一次性下载(因为我们已经硬编码了id),如果您触发多次下载,那么我建议您通过将iframe存储在更广泛的可访问变量中来重用iframe。 p>

答案 1 :(得分:7)

download属性添加到a标记中,这似乎可以防止onbeforeunload被触发:

<a download href="mysite.com"></a>

来自this answer

答案 2 :(得分:4)

我猜想使用链接上的target属性可以解决问题。

<a href="http://www.example.com/somefile.zip" target="_blank">download</a>

不会验证(除非使用框架集doctype)但它可能会工作..它将创建一个新的选项卡或窗口,然后弹出文件下载(如果http标头说它应该),但它可能会留下新选项卡/打开窗户,或者保存后它可能会关闭......

另一方面,我认为有一个onbeforeunload处理程序,你有时不想触发声音可疑,为什么你还需要它呢?

答案 3 :(得分:4)

我知道这个答案真的很晚,但有一个简单的解决方案。动态创建iframe,并通过JavaScript将其“src”设置为您的下载URL。这将启动下载而不会触发卸载事件(我认为)。

答案 4 :(得分:0)

download attribute answer对我来说效果很好,但是在我注意到它之前,我尝试了一下,它也可以工作。以防万一,这在某些不下载链接的情况下很有用。

var linksThatDisableWarning = $('a'); // all links
linksThatDisableWarning.on('mousedown', () =>
    window.isclicking = true);
linksThatDisableWarning.on('mouseup', () =>
    setTimeout(() => window.isclicking = false, 200))
window.addEventListener('beforeunload', (event) => {
  if (window.isclicking) return;
  event.preventDefault();
  event.returnValue = '';
});