object标签的onload/onerror事件在现代浏览器中基本不触发,仅同源svg可能勉强触发;pdf嵌入是唯一可用场景,但需严格匹配data、type与服务端content-type,fallback仅在http失败或mime不匹配时生效,推荐改用iframe或pdf.js实现可靠加载检测。

object 标签没有可靠的 onload / onerror 事件
你写 onload 或 onerror 几乎不会触发——这不是代码漏了,是浏览器根本不支持。现代 Chrome、Firefox、Edge、Safari 对 <object></object> 的插件类资源(包括 PDF)不派发这些事件:Failed to load resource 只出现在 Network 面板,控制台静默,JS 无法捕获。
唯一能“勉强”触发 onload 的场景是同源 SVG(非嵌入式,而是作为文档直接加载),但 PDF 不在此列。别把 onload 当作加载成功的信号,它不可靠,也不代表渲染就绪。
PDF 是唯一还能用 object 的场景,但成功取决于服务端响应头
判断是否“加载成功”,本质是判断浏览器是否决定内嵌渲染 PDF,而非下载或白屏。这由三者共同决定:
-
data必须是 HTTP(S) URL(file://协议下多数浏览器拒绝加载) -
type必须严格为"application/pdf"(写成"pdf"、"text/pdf"或留空,均失效) - 服务端响应头必须含
Content-Type: application/pdf;Nginx/Apache 若未配置 MIME 类型,返回text/plain或application/octet-stream,就会跳过内嵌逻辑,直接下载或 fallback
加 typemustmatch 属性可强制校验:若响应头与 type 不一致,浏览器会放弃渲染并进入 fallback,而不是冒充 PDF 渲染 HTML 内容。
fallback 内容不等于“加载失败提示”,它只在特定条件下显示
<object></object> 内部的 fallback(比如 <p>PDF 加载失败</p><div class="aritcle_card flexRow artxards">
<div class="artcardd flexRow">
<a class="aritcle_card_img" rel="nofollow" href="/xiazai/skill5806" title="html-deploy"><img
src="https://img.php.cn/upload/skill/000/000/081/179066538882434.jpg" alt="html-deploy" onerror="this.onerror='';this.src='/static/lhimages/moren/morentu.png'" ></a>
<div class="aritcle_card_info flexColumn">
<a rel="nofollow" href="/xiazai/skill5806" title="html-deploy" class="overflowclass">html-deploy</a>
<p class="overflowclass">使用 htmlcode.fun 将 HTML 内容或文件部署到网页,适用于用户要求“部署到网页”“托管此 HTML”“生成此前端...的实时链接”等场景。</p>
</div>
<a rel="nofollow" href="/xiazai/skill5806" title="html-deploy" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span>
</a>
</div>
</div>)不是兜底万能层,它只在以下情况才生效:
- HTTP 请求失败(404、500、断网)
- 响应头
Content-Type与type不匹配(哪怕文件真实存在)
但它不会响应这些常见问题:
-
data路径拼错(如"./pdfs/report.pdf"实际在"./docs/")→ 静默白屏,不触发 fallback - CORS 阻止加载 → 控制台报错但不进 fallback
- PDF 文件损坏或加密 → 浏览器可能尝试渲染空白页,也不触发 fallback
fallback 内容必须是合法 HTML 元素(<p></p>、<div> 等),注释、纯文本、<code><script></script> 都无效。
真正可用的检测方式:用 iframe 替代 object + 监听 load
如果你需要明确知道“PDF 是否加载完成”,<iframe></iframe> 是目前唯一稳定可行的方案:
<iframe src="report.pdf" onload="console.log('PDF loaded')" onerror="console.error('PDF load failed')"></iframe>
iframe 支持标准的 onload 和 onerror,行为跨浏览器一致。注意:
- 确保 PDF 路径可跨域访问(CORS 配置正确)
- 移动端微信/QQ 内置浏览器仍可能唤起系统 PDF 应用,此时
onload仍会触发,但用户看不到内嵌内容 - 若需进一步控制(如获取页面数、缩放、跳转页),必须用 PDF.js 等 JS 库,而非依赖
<object></object>或<iframe></iframe>
真正容易被忽略的是:你试图“检测 object 是否加载成功”,其实是在和浏览器的旧机制较劲——它没设计成可检测的组件。与其绕弯子补救,不如换用 iframe 或 PDF.js,从根上解决问题。










