备用文本必须写在<object>标签体内且为可渲染节点,type属性不可省略,data需可访问,否则降级失效。

直接在 <object> 开始标签和结束标签之间写内容,就是备用文本;浏览器只要无法加载 data 指向的资源,或不支持 type 声明的类型,就会渲染这些内容——不需要 JS,也不依赖 CSS 伪类。
备用内容必须写在 object 标签体内,不能靠注释或空格占位
很多开发者误以为加个 HTML 注释(<!-- 备用文字 -->)或只写空格就能触发降级,但浏览器完全忽略这类内容。只有实际可渲染的子节点才有效:
- 普通文本,如
<p>您的浏览器不支持 PDF 查看器</p> - 嵌套的
<img>,如<img src="fallback.png" alt="图表截图"> - 链接,如
<a href="report.pdf" download>下载 PDF 版</a> - 甚至可以嵌套另一个
<object>或<embed>作为二级降级
注意:必须有明确的结束标签 </object>,自闭合写法(<object ... />)会导致备用内容被丢弃。
type 属性不是可选的,它直接影响备用内容是否触发
type 不仅是文档说明,它是浏览器判断“是否该走降级逻辑”的关键依据。如果省略 type,部分浏览器(尤其是旧版 Safari 和 IE)会跳过类型校验,直接尝试加载 data,即使失败也不一定渲染备用内容。
立即学习“前端免费学习笔记(深入)”;
- PDF 资源必须写
type="application/pdf" - HTML 片段要写
type="text/html" - SVG 文件推荐
type="image/svg+xml",否则可能被当成普通图片处理而丢失交互 - 若设置了
typemustmatch属性,且服务器返回的 Content-Type 与type不一致,备用内容一定会被激活
常见失效场景和对应修复
备用内容“写了却没显示”,通常卡在这几个环节:
-
dataURL 是相对路径但当前页面由file://协议打开 → 浏览器因安全策略拒绝加载 → 改用本地 HTTP 服务(如python3 -m http.server)测试 - 服务器对
data返回了 200 状态码,但响应体为空或格式错误 → 备用内容不会触发(浏览器认为“加载成功”)→ 用 DevTools 的 Network 面板确认响应内容和 Content-Type - 备用内容里包含
<script>标签 → 多数浏览器会解析但不执行其中 JS → 如需行为降级,改用onerror事件 + 外部脚本控制,不要把逻辑塞进备用内容里 - 父容器设置了
display: none或visibility: hidden→ 备用内容虽存在,但不可见 → 检查 CSS 继承和层叠
真正可靠的备用体验,不靠猜浏览器行为,而是靠显式声明 type、验证 data 可访问性、并把降级内容写成真实可渲染的 HTML 节点——这三点漏掉任何一环,备用逻辑就形同虚设。



















