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

时间:2017-02-20 09:24:54

标签: javascript firefox websocket download window.location

我目前正在尝试使用Javascript中的以下代码触发文件下载: window.location.href = downloadUrl;

这在Chrome,IE和Edge中运行良好,但Firefox由于新的URL而卸载了页面,因此关闭了所有打开的websockets。我知道这是FF的一种奇怪的习惯,但有没有可以使用的解决方法? 它可以与window.open(downloadUrl);一起使用并在某个超时后关闭新选项卡,但我想阻止打开一个新标签只是为了触发下载。

任何帮助将不胜感激,谢谢。

2 个答案:

答案 0 :(得分:1)

经过大量的研究和实验,我找到了以下解决方案:

使用下载属性在JavaScript中创建一个链接,单击它并在一段时间后删除它(我正在使用ExtJs):

var a = document.createElement("a");
document.body.appendChild(a);
a.style = 'display: none';
a.href = downloadUrl;
a.download = 'test.zip';
a.click();

Ext.defer(function(link) {
    document.body.removeChild(link);
}, 200, this, [a]);

答案 1 :(得分:1)

在这个问题上偶然发现。当用户单击链接(包括“下载”链接)时,浏览器认为他正在离开当前页面并关闭websocket(这可能是合理的)。通过Javascript onclick事件(或window.open等)打开链接没有帮助。设置target =“ _ blank”会有所帮助,但在单击时会产生不舒服的眨眼。最后,我想到了以下内容:

<iframe src="about:blank" name="iframe_a" class="ws_keep_conn"></iframe>
<a href="https://www.fileserver.com/file.xml" target="iframe_a">Click this</a>

CSS

.ws_keep_conn {position: absolute; left: -9999px; visibility: hidden;}

仅此而已,websocket可以正常运行,而且行为不眨眼!