download属性仅对同源URL生效,跨域、file://协议、Safari/iOS及IE均不支持;正确使用需同源href且非空,服务端Content-Disposition头会覆盖download值。
浏览器明确限制 download 属性仅在协议、域名、端口三者完全一致时起作用。哪怕只是 http:// 和 https:// 的差异,或 a.example.com 与 b.example.com 这种子域不同,都会被判定为跨域——此时属性被静默忽略,点击后直接导航或内联打开。
本地双击 HTML 文件(file:// 协议)也属于“跨源”场景:两个 file:// 路径之间无法建立同源关系,因此 download 全面失效。必须起本地 HTTP 服务(如 npx serve 或 python3 -m http.server)才能测试真实行为。
常见误写包括:
<a download="report.pdf">下载</a> —— 缺少 href,点击无响应<a href="" download="report.pdf">下载</a> —— 空 href 可能触发页面刷新<a href="javascript:void(0)" download="report.pdf">下载</a> —— javascript: 协议不支持 download
<a href="#section" download="report.pdf">下载</a> —— 锚点链接不发起资源请求,download 彻底无效正确前提:必须有可解析、可获取的同源 URL 值,例如 /assets/data.csv 或 ./files/report.pdf。
iOS/iPadOS Safari 所有版本均无视 download 属性,同源链接也会预览而非下载;IE10/11 不支持该属性,且 Blob 构造函数需用 MSBlob 或特殊参数绕过。
这意味着:只要项目需兼容 Safari(尤其是移动端用户),就不能依赖 <a download> 作为主方案。唯一稳定 fallback 是服务端返回 Content-Disposition: attachment; filename="xxx" 响应头——它不依赖前端属性,也不受同源限制。
当服务端响应中包含 Content-Disposition 头时,浏览器优先采用其中的 filename 字段,download 属性值会被忽略。
例如:
Content-Disposition: attachment; filename="invoice-2026.pdf"
即使 <a href="/api/export" download="user-report.pdf">,最终保存名仍是 invoice-2026.pdf。
注意:download 值不能含路径字符(/、、: 等),否则整个属性被浏览器静默丢弃;中文名一般没问题,但 Windows 下某些非法字符仍可能被截断。
Content-Disposition 的情况,硬套 download 反而增加不可控分支。