我无法让我的脚本多次运行window.location.replace
。我有一个烧瓶应用程序,根据服务器上的流访问日志找到的唯一ID,创建文件。一旦文件在服务器上,我有一个烧瓶路线,如果用户被重定向到https://somewebsite.com/getFile/<id>
,它将把在服务器上创建的文件推送到客户端。
以下是我的脚本:
<script>
var xhr = new XMLHttpRequest();
xhr.onreadystatechange = function(){
var response = '';
if(xhr.readyState === 4 && xhr.status === 200){
response = xhr.responseText;
response = response.substring(0, response.length-1);
response = response.split('\n');
for(x in response){
url_path = response[x];
window.location.replace(url_path);
};
};
};
xhr.open('GET', '{{ url_for('stream') }}', true);
xhr.send();
</script>
我做了一些console.log()
次调用,看看for循环是否正常运行。即使url_path
给window.location.replace
也是正确的。需要注意的一点是,当重定向到https://somewebsite.com/getFile/<id>
时,浏览器在技术上不会更改为该url路径,因为flask没有呈现模板,而是返回下载文件,因此浏览器保持在下载文件后的当前url路径。
我不确定为什么我不能让脚本多次运行window.location.replace
。似乎响应对象中有2个url_path,只下载了最后一个。 3或4路径也是如此。任何见解都会有所帮助。感谢
答案 0 :(得分:1)
我刚才想到的另一种解决方案是,不是将同一个浏览器重定向到多个网址,为什么不在不同的标签中打开它们。我是通过使用window.open
来做到这一点的,令我惊讶的是它确实起作用。
但是,我的浏览器弹出窗口阻止程序最初阻止它们,但在更改设置并允许页面弹出窗口后,我成功地将多个文件下载到客户端。此外,由于服务器端没有模板渲染,因此标签本身实际上不会弹出,因此浏览器不会被标签所淹没。
如果有人知道原因,我仍然有兴趣了解为什么window.location.replace
无效。
答案 1 :(得分:0)
您的代码无法正常工作,因为window.location.replace
所做的是用新URL提供的原样替换源文档(请参见documentation)。
这意味着您放在window.location.replace
之后的任何代码都不会执行。
这就是为什么window.open可以完美地适合您的情况的原因,因为它将打开一个新文件,而不是被调用的文件。但请注意,因为并非所有参数都适用于所有浏览器(请检查this的兼容性规范)。