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

Posted

技术标签:

【中文标题】在 Firefox 中更改 window.location.href 而不关闭 websockets【英文标题】:Change window.location.href in Firefox without closing websockets 【发布时间】:2017-02-20 09:24:54 【问题描述】:

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

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

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

【问题讨论】:

【参考方案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]);

【讨论】:

解决方案对我不起作用,websocket 仍然像以前一样关闭。我测试了window.open( uri ).close();,但这在 Opera 中不起作用,因为它还会关闭询问在哪个应用程序中打开链接的提示。 我刚刚在我的软件中尝试了提供的解决方案,使用临时链接下载文件并保持 WebSockets 打开仍然可以正常工作(在 Firefox 中)。 Firefox 还会打开一个提示,询问在下载文件时要在哪个应用程序中打开链接,但该提示不会关闭 websocket。 我不熟悉 ExtJs,但我猜它在这个解决方案中没有任何作用。使用 FireFox (68.0.2),我收到提示,询问在哪个应用程序中打开 uri(我使用的是 lightning://...,但也使用 tg:// 进行了测试),但是在 Websocket 断开连接后一两帧信息。除了您认为可能缺少的已发布代码之外,是否还有其他内容?我什至通过将链接添加到我的html 作为<a href="lightning://testlink" download="NOTHING.txt">LINK</a> 与相同的 Websocket 关闭问题进行了尝试。 我目前的解决方案是检查浏览器是否为 FireFox if (/Firefox[\/\s](\d+\.\d+)/.test(navigator.userAgent)) //code 并通过 window.open( url ) 打开链接 对解决方案不太满意,但它在我的测试中有效。【参考方案2】:

偶然发现了这个问题。当用户单击链接(包括“下载”链接)时,浏览器认为他正在离开当前页面并关闭 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 生活,流畅的行为,没有眨眼!

【讨论】:

以上是关于在 Firefox 中更改 window.location.href 而不关闭 websockets的主要内容,如果未能解决你的问题,请参考以下文章

在 Firefox 中更改 accesskey 修饰键

在 IE/Chrome 中动态更改嵌入式视频 src(适用于 Firefox)

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

jQuery 内容()更改 iframe 的 html 在 Firefox 中消失

如何让 Firefox 在文件更改时自动刷新?

使用 AngularJS 在 Firefox 中更改请求标头时遇到问题