应使用<param>子标签传参,而非object属性;如<param name="flashvars" value="autoplay=1&volume=80">,且需确保浏览器仍支持对应插件。

object 标签嵌入 Flash 或旧式插件时怎么传参
现在绝大多数场景下不该用 <object> 嵌入多媒体,尤其是 Flash 已被全平台弃用。但如果你在维护遗留系统(比如 IE 兼容的内部工具),或需要调用特定 ActiveX/npapi 插件,<object> 仍是唯一选择 —— 它靠 <param> 子标签传参,不是通过属性。
常见错误是把参数写成 <object data="xxx.swf" width="600" height="400" flashvars="a=1&b=2">,这完全无效。flashvars 等参数必须用 <param> 显式声明:
<object type="application/x-shockwave-flash" data="player.swf" width="600" height="400"> <param name="movie" value="player.swf"> <param name="flashvars" value="autoplay=1&volume=80"> <param name="wmode" value="transparent"> <param name="allowscriptaccess" value="always"> </object>
-
name必须拼写准确(如flashvars不是flashVars或FlashVars) -
value中的 URL 参数需手动encodeURIComponent编码,尤其含中文或特殊符号时 - 多个
<param>顺序无关,但部分老插件(如某些 RealPlayer 控件)对src或url参数位置敏感 - IE 下若未指定
classid(如clsid:D27CDB6E-AE6D-11cf-96B8-444553540000),可能 fallback 到type+data,行为不一致
为什么现代浏览器里 object 基本不工作
Chrome 从 v45、Firefox 从 v52、Edge 从 v14 起已彻底移除 NPAPI 插件支持;Safari 更早。这意味着:type="application/x-java-applet"、type="application/x-vlc-plugin" 这类声明会静默失败,控制台通常只报 Failed to load resource 或直接空白。
你无法靠加 <param> 让它复活 —— 底层插件接口已不存在。此时该做的事是:
立即学习“前端免费学习笔记(深入)”;
- 确认目标环境是否真有对应插件(例如仅 IE11 + 内网 ActiveX 组件)
- 检查浏览器是否启用“兼容性视图”或企业策略强制加载旧渲染引擎
- 用
navigator.plugins或document.embeds检测插件是否存在,再决定 fallback 方案 - 不要依赖
<object>的onerror事件:它在插件不可用时往往不触发
替代方案:用 video/audio 标签 + JS 控制参数
如果目标只是播放视频/音频,<video> 和 <audio> 是唯一可靠路径。它们不接受 <param>,但可通过 JS 动态设置属性或调用方法:
<video id="myVideo" controls>
<source src="demo.mp4" type="video/mp4">
</video>
<script>
const vid = document.getElementById('myVideo');
vid.volume = 0.8; // 相当于旧 param volume=80
vid.autoplay = true; // 相当于 flashvars autoplay=1
vid.muted = false; // 注意 muted 优先级高于 volume
vid.addEventListener('loadedmetadata', () => {
vid.play(); // 避免自动播放策略拦截
});
</script>
- 所有媒体参数都变成 JS 可读写的属性,无需拼字符串或编码
- 音视频格式兼容性由浏览器决定,不用操心编解码器注册问题
- 移动端 iOS/Android 对
autoplay、muted有严格限制,必须用户手势触发首次播放 - 想传自定义配置(如字幕轨道、CDN token),建议走 API 接口获取后动态生成
<source>或用MediaSourceAPI
容易被忽略的 object 兼容细节
即使在支持插件的旧环境中,<object> 行为也比表面复杂得多:
-
data和movie参数冲突时,IE 优先用movie,其他浏览器用data—— 所以两个都写且保持一致 -
<param name="bgcolor">在 Flash 中有效,但在 VLC 插件中可能是background,名称无统一标准 - 插件初始化是异步的,不能在
<object>后立刻调用document.getElementById(...).GetVariable(),得监听load或用setTimeout轮询 - HTTPS 页面加载 HTTP 插件资源会因混合内容被拦截,且不会提示明确错误,只留白
真正难的不是写对 <param>,而是确认那个插件还在哪个浏览器上能跑、它的参数文档是否还找得到、以及有没有人愿意帮你调试 IE8 的 ActiveX 安全警告弹窗。



















