使用JQuery Ajax进行HTTP文件下载请求时停止调用

7
问题:
在我正在构建的网站上,我有两个 JQuery ajax 长轮询调用一直处于挂起状态。现在我正在尝试添加一个文件下载功能,以便当用户按下链接时,用户会被提示保存框。该文件的下载正常工作,问题是当用户按下该链接时,这两个ajax调用被取消了。
我要么不想取消ajax调用,要么想立即设置ajax调用的可能性。
以下是链接的代码:
HTML:
<a href="/test" id="testfile">Tasks</a>

JS:

$(document).on('click',"#testfile",function(event){
    event.preventDefault();
    var href=$(this).attr('href');
    window.location.href = href;
    updater();                               /* AJAX CALL #1 */
    notifier();                              /* AJAX CALL #2 */
});

在上面的代码中,我试图在启动下载后调用两个ajax调用。但是这不起作用。如果我加入一些延迟,以便在下载完成后启动调用,则可以正常工作。但由于文件可能很大,因此需要花费未知的时间来接收,因此这当然是一个不好的解决方案。
我真的很困惑为什么ajax调用被取消了?这是因为我按下链接时页面被卸载了吗?
考虑到我只在具有一个线程的开发服务器上运行,所以我在跟随链接后尝试设置的新ajax调用可能会因服务器繁忙而失败,这可能是原因吗?
解决方法:
我在站点底部添加了一个隐藏的iframe,并使用我的链接进行了定位。我还删除了JS代码,因为现在不再取消ajax调用。
代码现在如下所示:
HTML:
<a href="/test" target="filetargetframe"  id="testfile">Tasks</a>

********

<iframe name="filetargetframe" style="display:none"></iframe>

4
window.location.href 会改变页面,这将取消所有操作。尝试创建一个 iframe 并将 src 设置为 href,或许可以解决问题。 - yoavmatchulsky
即使在我的情况下window.location.href没有改变页面,而只是启动了文件的下载,但浏览器仍然将其视为已更改的页面,因此停止ajax调用?我该如何通过iframe解决这个问题? - ReturnToZero
不,如果是下载,它不会改变页面。你可以尝试使用iframe,但我怀疑你会遇到同样的问题。要使用iframe,请在页面上放置一个iframe,将其隐藏(可选),然后在锚标签中添加target="theiframeid",并停止阻止默认操作。(停止更改location.href,让锚点单击的默认操作执行该操作) - Kevin B
@KevinB 看起来可以了。现在ajax调用不会被取消了。非常感谢! - ReturnToZero
1
@yoavmatchulsky 应该将评论的后半部分发布为答案。 - Kevin B
1个回答

5

使用yoavmatchulsky的答案解决了问题:

我在网站底部添加了一个隐藏的iframe,并用我的链接指向它。我也删除了JS代码,因为现在ajax调用不会被取消。

代码现在看起来像这样:

HTML:

<a href="/test" target="filetargetframe"  id="testfile">Tasks</a>

********

<iframe name="filetargetframe" style="display:none"></iframe>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接