在for循环中多次执行window.location.replace

时间:2018-05-01 23:39:16

标签: javascript xml xmlhttprequest

我无法让我的脚本多次运行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_pathwindow.location.replace也是正确的。需要注意的一点是,当重定向到https://somewebsite.com/getFile/<id>时,浏览器在技术上不会更改为该url路径,因为flask没有呈现模板,而是返回下载文件,因此浏览器保持在下载文件后的当前url路径。

我不确定为什么我不能让脚本多次运行window.location.replace。似乎响应对象中有2个url_path,只下载了最后一个。 3或4路径也是如此。任何见解都会有所帮助。感谢

2 个答案:

答案 0 :(得分:1)

我刚才想到的另一种解决方案是,不是将同一个浏览器重定向到多个网址,为什么不在不同的标签中打开它们。我是通过使用window.open来做到这一点的,令我惊讶的是它确实起作用。

但是,我的浏览器弹出窗口阻止程序最初阻止它们,但在更改设置并允许页面弹出窗口后,我成功地将多个文件下载到客户端。此外,由于服务器端没有模板渲染,因此标签本身实际上不会弹出,因此浏览器不会被标签所淹没。

如果有人知道原因,我仍然有兴趣了解为什么window.location.replace无效。

答案 1 :(得分:0)

您的代码无法正常工作,因为window.location.replace所做的是用新URL提供的原样替换源文档(请参见documentation)。 这意味着您放在window.location.replace之后的任何代码都不会执行。

这就是为什么window.open可以完美地适合您的情况的原因,因为它将打开一个新文件,而不是被调用的文件。但请注意,因为并非所有参数都适用于所有浏览器(请检查this的兼容性规范)。