让用户通过JavaScript下载文件?
我试图有一个按钮,用户可以点击下载文件,但该文件可能不存在,因为它是其他文件的压缩文件,必须生成。我正在用AJAX检查这一点,但一旦我收到一个正确的URL,我不知道如何让用户下载它让用户通过JavaScript下载文件?,javascript,jquery,ajax,browser,Javascript,Jquery,Ajax,Browser,我试图有一个按钮,用户可以点击下载文件,但该文件可能不存在,因为它是其他文件的压缩文件,必须生成。我正在用AJAX检查这一点,但一旦我收到一个正确的URL,我不知道如何让用户下载它 window.open(链接“u blank”)尝试打开窗口下载文件,但大多数浏览器会阻止此操作,并将其视为弹出窗口。让用户下载这样的文件的最佳实践是什么?谢谢 下面是我用来参考的JS函数: function getDownloadedFiles() { var INTERVAL_TIME = 3000,
window.open(链接“u blank”)
尝试打开窗口下载文件,但大多数浏览器会阻止此操作,并将其视为弹出窗口。让用户下载这样的文件的最佳实践是什么?谢谢
下面是我用来参考的JS函数:
function getDownloadedFiles() {
var INTERVAL_TIME = 3000,
$projectView = $('#project-view'),
id = $projectView.data("project-id");
$.ajax({
type: "GET",
url: AJAX_URL + id,
success: function(data) {
if (data.success) {
var link = data.profiler.link;
window.open(link, '_blank');
} else {
setTimeout(getDownloadedFiles, INTERVAL_TIME);
}
}
});
}
也许你可以用一个隐藏的iframe来解决这个问题。试试这个:
var downloadURL = function downloadURL(url) {
var hiddenIFrameID = 'hiddenDownloader',
iframe = document.getElementById(hiddenIFrameID);
if (iframe === null) {
iframe = document.createElement('iframe');
iframe.id = hiddenIFrameID;
iframe.style.display = 'none';
document.body.appendChild(iframe);
}
iframe.src = url;
};
最后,正确的解决方案是,我使用了错误的URL 我将链接设置为data.profiler.link,但实际上是data.data.link,这让我很困惑 这是我的最终代码:
function getDownloadedFiles() {
var INTERVAL_TIME = 3000,
$projectView = $('#project-view'),
id = $projectView.data("project-id");
$.ajax({
type: "GET",
url: AJAX_URL + id,
success: function(data) {
if (data.success) {
var link = data.data.link,
hiddenIFrameID = 'hiddenDownloader',
iframe = document.getElementById(hiddenIFrameID);
if (iframe === null) {
iframe = document.createElement('iframe');
iframe.id = hiddenIFrameID;
iframe.style.display = 'none';
document.body.appendChild(iframe);
}
iframe.src = link;
} else {
setTimeout(getDownloadedFiles, INTERVAL_TIME);
}
}
});
}
把窗户打开。如果浏览器无法自动处理该文件,它将自行打开“另存为”对话框。除非用户已经有了首选项集,在这种情况下,它只会将文件下载到他们的驱动器,并在下载完成时通知他们。可能是重复的。我研究了这个问题,解决方案对我不起作用。我发现我没有调用正确的URL,因此代码确实起作用。我要删除这个问题,因为它是一个重复的问题。也许你可以展示更多的代码,说明你是如何使用上面提到的线程来处理你的线程的。我发现我没有调用正确的URL,所以代码确实有效。我要删除这个问题,因为它是重复的。