在不关闭 websockets 的情况下在 Firefox 中更改 window.location.href

Change window.location.href in Firefox without closing websockets

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

这在 Chrome、IE 和 Edge 中工作正常,但 Firefox 由于新 URL 卸载了页面,因此关闭了所有打开的 websockets。我知道这是 FF 的一种奇怪的习惯,但是有什么我可以使用的解决方法吗? 它可以与 window.open(downloadUrl); 一起使用并在一定超时后关闭新选项卡,但我想防止打开一个新选项卡只是为了触发下载。

如有任何帮助,我们将不胜感激,谢谢。

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

在JavaScript中创建一个带有下载属性的link,点击它并在一段时间后将其删除(我使用的是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]);

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

<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 生活,没有 blink!

的流畅行为