object标签传参必须用<param>且置于其内部,flashvars等属性无效;PDF是唯一稳定场景,需data可访问、Content-Type正确、type为application/pdf;Flash/Java等插件已全面废弃,应改用video/audio/iframe或PDF.js。

object 标签里传参必须用 <param>,不能写在属性上
常见错误是把参数直接塞进 <object> 标签的属性里,比如 <object data="player.swf" flashvars="autoplay=1"> —— 这个 flashvars 属性浏览器完全忽略。真正起作用的只有嵌套在 <object> 内部的 <param> 标签。
关键点:
-
<param>必须放在<object>开始与结束标签之间,放外面或放错位置(比如塞进<body>顶层)就无效 -
name值要严格匹配插件文档,大小写、拼写、下划线都不能错:Flash 认flashvars,不认FlashVars;Java Applet 认code和archive,不认CODE -
value中含&、=、中文等字符时,必须用encodeURIComponent()编码,否则参数截断或解析失败 - 多个
<param>顺序一般无关,但某些老插件(如 RealPlayer)要求src或url参数必须出现在最前
PDF 是目前 <object> 唯一稳定可用的场景
Flash、Java Applet、QuickTime 等插件在 Chrome v45+、Firefox v52+、Edge v14+ 中已彻底移除支持,<object> 对它们只是“语法合法,运行静默失败”。唯一还广泛可用的是 PDF 嵌入,但有硬性前提:
-
data指向的 PDF 文件必须可访问,且服务器返回响应头Content-Type: application/pdf;若返回text/plain或 404,浏览器会直接下载或显示空白 -
type必须写成application/pdf,写成pdf、text/pdf或留空,都会跳过渲染、直接 fallback - 宽高建议用 CSS 控制(如
style="width:100%; height:600px;"),避免width/height属性在响应式布局中失效 - fallback 内容(如提示文字)必须是合法 HTML 元素,比如
<p>,不能是空格、注释,也不能是另一个<object>或<embed>
现代浏览器里 <param> 失效不是代码问题,是底层没了
你在控制台看不到报错,页面就是白的——这不是你漏写了 <param>,而是浏览器根本没加载插件宿主。NPAPI(Flash/Java)、ActiveX(IE 内网组件)这些接口在主流浏览器中已被物理删除。
立即学习“前端免费学习笔记(深入)”;
能工作的极少数情况:
- 仅限 IE11 + 企业内网 + 启用兼容性视图 + 明确指定
classid(如clsid:D27CDB6E-AE6D-11cf-96B8-444553540000) - 部分旧版 PDF 阅读器插件(如 Adobe Acrobat NPAPI 插件),但需用户手动启用,且 Chrome 已强制禁用
- 用
navigator.plugins检测不到对应插件时,<param>就是摆设,别指望它触发onerror
替代方案很明确:音视频用 <video>/<audio> + JS 控制;外部网页用 <iframe>;PDF 若需强控制(比如跳转页码、高亮文本),走 PDF.js 等 JS 库。
<embed> 不是 <object> 的简化版,它是被弃用的 void 元素
有人把 <embed src="xxx.swf"> 当作 <object> 的快捷写法,这是危险误解。<embed> 是 void 元素,不能嵌套内容,也不支持 <param>,所有参数都靠属性传,而这些属性在不同 MIME 类型下行为混乱甚至被忽略。
更实际的问题:
- 它没有 fallback 机制:失败时只能白屏或报错,无法提示用户“请下载 PDF”之类的信息
- 现代浏览器对
<embed>的处理逻辑不统一,Chrome 可能尝试用内置 PDF 查看器,Firefox 可能直接拒绝加载 - W3C 明确不推荐使用,HTML5 规范中它属于“遗留元素”,只保留向后兼容
如果你看到还在用 <embed> 的项目,优先重构为 <object> + 正确 fallback,或者一步到位换成语义化现代标签。



















