gpt4 book ai didi

javascript - 更改 window.location.href 会中止 AJAX

转载 作者:行者123 更新时间:2023-12-05 07:59:07 30 4
gpt4 key购买 nike

我有一个带有按钮的 HTML 页面。当用户单击该按钮时,window.location.href 将更新为文本文件的 URL。文本文件随 Content-Disposition: attachment 一起提供,因此文件已下载且未在浏览器中打开。

问题是此页面上还发生了 AJAX 请求。每当 window.location.href 发生变化时,所有 AJAX 请求都会自动中止(或者至少不会触发 jQuery.ajax error 事件)。

那么如何在不重新加载页面或中止任何 AJAX 的情况下下载文件?我需要在 IE7+ 中执行此操作(更新: 需要在 IE7+ 和现代浏览器(包括 iOS 和 Android)中工作

这是一些示例代码。我在 Express 中创建了两个端点; /ajax 只是响应一个简单的 JSON; /download 十秒后以文本文件响应。如果您单击“启动 AJAX”以请求 /ajax,然后单击“开始下载”以请求 /download,则 AJAX 请求将中止。定时器只是为了方便使用。

HTML

<html>

<head>
<title>Firefox Download &amp; AJAX Test</title>

<script src="bower_components/jquery/dist/jquery.js"></script>

<body>
<form method="GET" action="">
<button id="btn-ajax" type="submit">Start AJAX</button>
<button id="btn-download" type="submit">Start Download</button>
</form>

<div id="dynamic-content"></div>

<script>
(function() {
var $dynamicContent = $("#dynamic-content");

$("form").submit(function(e) { e.preventDefault(); });

$("#btn-ajax").click(function() {
var $btn = $(this).prop("disabled", true),
left = 10,
countdown;

function tick() {
if ( left <= 0 ) {
stop();
}

$dynamicContent.text(left--);
}

function stop() {
$btn.prop("disabled", false);
clearInterval(countdown);
}

countdown = setInterval(tick, 1000);
tick();

$.ajax({
method: "GET",
url: "/ajax",
complete: stop,

success: function(data) {
$dynamicContent.text(data.value);
},

error: function() {
$dynamicContent.text("Error!");
}
});
});

$("#btn-download").click(function() {
window.location.href = "/download";
});
})();
</script>

Express 路由器

// GET /download
exports.download = function(req, res) {
res.set("Content-Type", "text/plain");
res.set("Content-Disposition", "attachment; filename=download.txt");
res.send("You have downloaded this text file");
};

// GET /ajax
exports.ajax = function(req, res) {
setTimeout(function() { res.send({ value: "Success!" }); }, 10000);
};

感谢您的宝贵时间。

最佳答案

当您设置响应 header 以告诉浏览器这是一个下载时,而不是将当前页面指向链接为什么不打开一个新窗口(当浏览器看到此类 header 时它会立即消失)

window.open('/download', '_blank');

第二种方法是使用 <iframe> 指向位置用户看不到

<iframe id="downframe" src="about:blank" style="display:none;"></iframe>
document.getElementById('downframe').src = '/download';

关于javascript - 更改 window.location.href 会中止 AJAX,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22792957/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com