Skip to Content

用 a 标签打开 dateURL 的问题

const a = document.createElement('a'); a.href = dataUrl; a.target = '_blank'; a.click(); a.remove();

报错

Not allowed to navigate top frame to data URL:

主要原因

  • 出于安全考虑,现代浏览器不允许直接在新标签页中打开 data URL
  • data URL 可能包含恶意内容,所以浏览器会阻止这种直接导航

解决方案

const blob = dataURLtoBlob(dataUrl); // 将 data URL 转换为 Blob 对象 const blobUrl = URL.createObjectURL(blob); // 创建一个指向 Blob 的 URL a.href = blobUrl; // 使用 blob URL 而不是 data URL

Blob URL 是一个临时的、本地的 URL(格式如:blob:http://localhost:3000/xxxx-xxxx)

  • 浏览器认为这种 URL 更安全,因为它只能访问本地生成的内容
  • Blob URL 实际上指向内存中的数据,而不是直接包含数据本身

注意

  • Blob URL 会占用内存,所以需要在使用完后释放
setTimeout(() => { URL.revokeObjectURL(blobUrl); // 释放内存 a.remove(); // 移除临时创建的元素 }, 100);
Last updated on