在 Chrome 中使用目标"_blank"将锚点 href 设置为"blob:"网址时出现问题



我正在开发一个网站,允许用户下载页面的PDF版本。当前的解决方案是将生成的 HTML 呈现为服务器上的 PDF,结果返回 Base64 编码的 PDF。从此数据创建一个 Blob,后跟一个对象 URL,如下所示:-

const blob = new Blob([B64A.decode(pdfdata)], {type: 'application/pdf'});
dataURL = (window.URL || window.webkitURL).createObjectURL(blob);

然后将 dataURL(格式为">blob:http://www.example.com/abcd1234-abcd-abcd-abcd1234efa")分配给锚标记的href属性。目标属性也设置为"_blank",以便在新选项卡中打开生成的 PDF。

直到大约一周前,这绝对正常。 在Firefox中,一切仍然有效,但是在Chrome中存在问题。 单击链接时,选项卡会快速打开,然后立即关闭。 删除目标属性会导致一切正常工作,尽管 PDF 已加载到当前选项卡中,这不是我想要的。 控制台上没有记录任何内容,因此我没有从那里获得任何线索。

有没有人对为什么会发生这种情况有任何想法? 由于这才刚刚开始发生,我假设这是最新版本的Chrome的问题(我在Linux上运行57.0.2987.98(64位),尽管一位同事在Windows 10上也有同样的问题)。

编辑: 我刚刚创建了一个 CodePen 示例来演示这一点:https://codepen.io/anon/pen/OpOGbE

单击该按钮,应生成两个链接。 第一个应该在同一页面中正常打开。 第二个应该在新选项卡中打开,但不会在 Chrome 中打开(对我来说,它显示的行为与上面提到的相同)。

在运行此测试时,我刚刚注意到在隐身窗口中问题似乎不存在,并且新选项卡正确打开......

这似乎是Chrome中的一个临时错误。截至撰写本文时,该代码适用于当前的 Canary(测试版)Chrome (v.59.0.3044.1) 版本。

作为临时解决方法,您可以尝试使用原始 Base-64 数据,并在其前面附加一个 data-uri 标头,然后将其用作 href 的源:

const dataURL = "data:application/pdf;base64," + pdfdata;

最新更新