window.location.href 下载后执行函数

Posted

技术标签:

【中文标题】window.location.href 下载后执行函数【英文标题】:Excuting function after window.location.href download 【发布时间】:2013-10-06 15:54:37 【问题描述】:

我有一个使用简单的 window.location.href 命令启动的文件下载。由于我停留在同一个页面上,我想调用一个不同的函数来刷新页面的一部分,但是下载后这个其他函数没有被执行。有没有办法做到这一点? 我想我正在寻找类似 ajax 的“成功”选项。

谢谢!

【问题讨论】:

window.location.href? 之后你如何停留在同一页面上,你应该正在等待异步调用以完成下载。 不,没有,但是有一些变通方法,使用 ajax 或 cookie 检查下载何时完成,然后执行某些操作。 我停留在同一页面上,因为我将 URL 指向控制器,该控制器将文件返回给我,其中包含内容处置设置和正确的 mime 类型。因此,如果我使用非常简单的 ajax 后调用而不进行任何处理,只需添加 success: function()myfunc(a).. 可以吗? 最好的方法可能是下载完成后在服务器端设置一个cookie,然后用javascript不断检查cookie,当检测到cookie时做一些事情。 我认为这次下载不会有那么大的问题。 :) 感谢您的回复! 【参考方案1】:

一个简单的 AJAX 后调用就足够了。特别是对于像文件下载这样的异步和时间可变的东西,XMLHttpRequestreadyState 属性非常有用。

【讨论】:

简单的ajax调用没有触发另存为窗口。其他一切都很好,我只需要看到那个窗口出现。知道怎么做吗? 你说的是 Content-Type: octet-stream 和 Content-Disposition: attachment? 是的,响应中的所有内容都已正确设置! 您可能想尝试创建一个 iframe 并将其源设置为文件的位置(应该在您的 AJAX 响应中) 我只是在调查这个答案! ***.com/questions/3749231/…【参考方案2】:

试试这个:

var req = new XMLHttpRequest();
req.open("POST", "your endpoint", true);
req.responseType = "blob";
req.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');

var fileName = "fileName.pdf";

req.onload = function (event) 
    var blob = req.response;

    if (req.status === 200) 
        var link = document.createElement('a');

        link.href = window.URL.createObjectURL(blob);
        link.download = fileName;
        link.click();

        //call your method her to do anything
    
;

req.send();

//if you have any parameter, you can this
//reg.send(param)

【讨论】:

以上是关于window.location.href 下载后执行函数的主要内容,如果未能解决你的问题,请参考以下文章

window.location.href 下载后执行函数

window.location.href

javaScript使用post方式代替window.location.href

在 Firefox 中更改 window.location.href 而不关闭 websockets

window.location.href=window.location.href 和 window.location.reload() 的区别

window.location和window.location.href的区别