Javascript 在for循环中多次执行window.location.replace
我无法让脚本多次运行Javascript 在for循环中多次执行window.location.replace,javascript,xml,xmlhttprequest,Javascript,Xml,Xmlhttprequest,我无法让脚本多次运行窗口.位置.替换。我有一个flask应用程序,它根据从服务器上的流访问日志中找到的唯一ID创建文件。一旦文件在服务器上,如果用户被重定向到https://somewebsite.com/getFile/,然后将在服务器上创建的文件推送到客户端 下面是我的脚本: <script> var xhr = new XMLHttpRequest(); xhr.onreadystatechange = function(){ var re
窗口.位置.替换。我有一个flask应用程序,它根据从服务器上的流访问日志中找到的唯一ID创建文件。一旦文件在服务器上,如果用户被重定向到https://somewebsite.com/getFile/
,然后将在服务器上创建的文件推送到客户端
下面是我的脚本:
<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>
var xhr=new XMLHttpRequest();
xhr.onreadystatechange=函数(){
var响应=“”;
如果(xhr.readyState==4&&xhr.status==200){
response=xhr.responseText;
response=response.substring(0,response.length-1);
response=response.split('\n');
用于(x响应){
url_path=response[x];
window.location.replace(url\u路径);
};
};
};
open('GET','{url_for('stream')}}',true);
xhr.send();
我执行了几个console.log()
调用,以查看for循环是否正确运行,并且是否正确。甚至提供给window.location.replace的url\u路径
也是正确的。需要注意的一点是,当重定向到https://somewebsite.com/getFile/
,从技术上讲,浏览器不会更改为该url路径,因为flask不会呈现模板,而是返回下载文件,因此下载文件后浏览器将保持在当前url路径
我不确定为什么无法让脚本多次运行window.location.replace
。看起来,如果响应对象中有2个url_路径,则只下载最后一个url_路径。3条或4条路径也是如此。任何见解都会有所帮助。谢谢我刚刚想出的另一个解决方案是,与其将同一个浏览器重定向到多个URL,不如在不同的选项卡中打开它们。我通过使用window.open
实现了这一点,令我惊讶的是,它确实起了作用
然而,我的浏览器弹出窗口拦截器一开始确实阻止了它们,但在更改设置并允许页面弹出窗口后,我成功地将多个文件下载到客户端。此外,由于服务器端没有模板呈现,因此选项卡本身实际上不会弹出,因此浏览器中不会充斥着选项卡
我仍然有兴趣知道为什么window.location.replace如果有人知道原因,那么它不起作用。你的代码不起作用,因为window.location.replace所做的就是用新URL提供的源文档替换源文档(请参阅)。
这意味着在window.location.replace
之后放置的任何代码都不会被执行
这就是为什么window.open非常适合您的情况,因为它将打开一个新文档,而不是它所调用的文档。但要小心,因为并非所有参数都适用于所有浏览器(请检查兼容性规范)。您可以尝试使用window.location.assign
而不是window.location.replace
@LeoFarmer感谢您的回复,我尝试使用window.location.assign
,但它仍然只下载了一个文件。我检查了服务器日志,只看到一个GET请求,而另一个没有。正在执行。我在请求之后添加了一个console.log
,它会同时打印两次。