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

psy*_*tik 10 javascript ajax download

我想在用户点击链接时为用户启动文件下载,但我有一个onbeforeunload处理程序,我不希望在下载开始时调用它.要下载,我现在有一个<a>href设置为文件的位置,但单击它在结果onbeforeunload中铬(不是FF,虽然)被调用.

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

想法?

tga*_*ard 11

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

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

示例代码:

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

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


Fel*_*lix 9

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

<a download href="mysite.com"></a>
Run Code Online (Sandbox Code Playgroud)

这个答案.


Ste*_*aug 4

我猜想使用链接上的目标属性可以解决这个问题。

<a href="http://www.example.com/somefile.zip" target="_blank">download</a>
Run Code Online (Sandbox Code Playgroud)

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

另一方面,我认为拥有一个您有时不想触发的 onbeforeunload 处理程序听起来很可疑,为什么您仍然需要它?