<param> 标签必须作为 <object> 的直接子元素使用,否则被浏览器忽略;<embed> 不支持 <param>,需通过 src 查询参数或 flashvars 属性传参;NPAPI 插件(如 Flash)在现代浏览器中已全面禁用。

param 标签只能用在 object 标签内部,且必须是子元素
浏览器会忽略所有脱离 <object> 的 <param>,哪怕它在页面里看起来“位置靠近”。这是最常被忽略的结构性前提。
常见错误现象:<param name="flashvars" value="a=1&b=2"> 单独写在 <div> 里,或放在 <embed> 外部——此时参数根本不会传给插件。
-
<object>必须有type或classid(IE 旧 ActiveX 场景),否则现代浏览器可能直接跳过整个块 -
name属性值区分大小写,Flash 插件认flashvars,不是FlashVars或FLASHVARS - 多个
<param>可并列,顺序无关,但重复name时仅最后一个生效
Flash 场景下 flashvars 参数需 URL 编码,且不能含 unescaped &
Flash Player 把 flashvars 当作查询字符串解析,所以 value 中的 & 必须写成 &,否则 HTML 解析阶段就截断了。
示例(正确):
<param name="flashvars" value="uid=123&token=abc%3Dxyz&mode=debug">
立即学习“前端免费学习笔记(深入)”;
错误写法:value="uid=123&token=abc%3Dxyz" —— 浏览器会把 &token 当作 HTML 实体开始,导致属性值提前结束,后续参数丢失。
- 中文或特殊字符必须用
encodeURIComponent()编码后再填入value,不能依赖浏览器自动处理 - Flash 内通过
root.loaderInfo.parameters读取,得到的是已解码后的对象,无需再 decode - 如果用 JS 动态插入
<param>,注意 DOM 设置element.value = "..."不会触发 HTML 实体解析,应直接设innerHTML或用document.createElement+setAttribute
Chrome 45+ 和 Firefox 52+ 已彻底禁用 NPAPI 插件,param 标签对 Flash/Java 失效
这不是 bug,而是浏览器主动移除能力。2017 年起主流浏览器不再加载任何基于 NPAPI 的插件,<object> + <param> 块会被静默忽略,控制台可能报 Failed to load plugin 或直接空白。
替代方案只有两个方向:
- WebAssembly / Canvas / WebGL 重写原有插件逻辑(如图表、音视频处理)
- 改用基于
<iframe>或<embed src="https://xxx.com/player.html?...">的 Web 应用嵌入,参数走 URL 查询字符串
仍想兼容旧系统?必须锁定浏览器版本(如 Chrome 44),且无法在 macOS Catalina 及之后运行(系统级禁止)。
embed 标签不支持 param,但可通过 src 查询参数或 DOM 属性传参
<embed> 是自闭合标签,没有子元素机制,因此 <param> 对它完全无效。但开发者常误以为可以混用。
正确做法分两种:
- 用
src拼接参数:<embed src="player.swf?uid=123&lang=zh">(Flash 支持读取root.loaderInfo.url后解析) - 用
flashvars作为<embed>的属性(非<param>):<embed flashvars="uid=123&lang=zh" ...>—— 这是 Netscape 插件规范的一部分,但仅部分旧版浏览器识别 - 现代实践:统一用 JS 创建
<object>或<iframe>,动态注入参数,避免硬编码<param>
真正容易被忽略的是:即使 <object> 和 <embed> 并存,浏览器也只加载其中一个(优先级由 UA 决定),参数不同步时行为不可控。



















