object标签的load事件不可靠,仅表示dom插入完成,不反映pdf或html等嵌入内容真实加载就绪;应改用iframe(同源html)或pdf.js(pdf),二者才提供准确的加载完成信号和可控api。

object 标签的 load 事件不可靠,它只表示 DOM 节点插入完成,不等于 PDF、HTML 或其他嵌入内容真正加载就绪。别指望它能告诉你页数、文本是否可选、缩略图是否生成——这些它一概不管。
为什么 object 的 load 事件基本没用
浏览器在把 <object></object> 插入 DOM 后立刻触发 load,此时内部资源(比如 PDF 渲染引擎、HTML 子文档解析)可能才刚开始初始化。你看到白屏、滚动卡死、contentDocument 为 null,都是这个“假完成”导致的。
- Chrome/Firefox 不允许通过
objectEl.contentDocument访问嵌入的 HTML 文档(跨域或同域都受限) - Safari 直接拒绝返回任何
contentDocument引用 - PDF 场景下,
load触发时连第一页都没渲染出来,更别说获取总页数或触发文本选择 - 移动端 fallback(如
<embed></embed>或<iframe></iframe>)常被忽略,load事件根本不会冒泡或触发
替代方案:优先用 iframe + load 事件
iframe 是目前最可控的嵌入方式,同源时能访问其 contentDocument,且 load 事件语义明确:子页面所有资源(HTML、CSS、JS、图片)加载并解析完毕。
- 同源 HTML 片段:监听
iframe的load后,可安全执行iframe.contentDocument.querySelector(...) - 必须确保
iframe已挂载到 DOM 再设置src,否则部分浏览器会跳过load事件 - 异步加载时,推荐用
fetch先取 HTML 字符串,再用iframe.contentDocument.write()注入(注意调用document.open()和close()) - 若需兼容旧版 iOS Safari,避免在
load回调里立即读取offsetHeight——加一层requestAnimationFrame确保样式已应用
PDF 场景必须放弃 object,改用 pdf.js
原生 object 渲染 PDF 没有 API、无法监听真实加载状态、不能控制缩放/跳页/文本搜索。唯一靠谱路径是 pdf.js。
- 用
pdfjsLib.getDocument(url)返回 Promise,resolve 后拿到PDFDocumentProxy,此时才算“PDF 加载完成” - 页数通过
pdfDoc.numPages获取,不是靠 DOM 尺寸或轮询 - 每页渲染完成可用
page.render(...).promise链式等待,比监听任何 DOM 事件都精确 - 不要试图把
pdf.js套进object里——它本质是 Canvas 渲染,跟object的插件模型完全不兼容
真正难的不是“怎么监听”,而是接受 object 在现代 Web 中已退化为一个仅用于兜底显示的标签。它的加载完成信号从语义上就不成立,强行监听只会掩盖问题。PDF 用 pdf.js,HTML 片段用 iframe,这才是能落地的方案。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











