标签必须嵌套在内且为直接子元素才有效,脱离该结构则参数被忽略;现代浏览器已移除npapi支持,基本失效,应迁移到html5原生方案或js api。

<param> 标签本身没有 param 属性,它只有 name 和 value 两个必需属性,且必须作为 <object></object> 的直接子元素存在——脱离这个结构,参数就根本不会被传递。
为什么写了<param>但插件收不到参数?
最常见的原因是结构错误:把 <param name="flashvars" value="a=1"> 放在 <object></object> 外面,或者塞进 <div>、<code> 里。浏览器直接忽略,不报错也不警告。
-
<param>只在<object></object>内部生效,且必须是其**直接子元素**(不能嵌套在<p></p>或其他标签里) -
<object></object>必须有type(如application/x-shockwave-flash)或classid(IE ActiveX 场景),否则现代浏览器跳过整个块 - Flash 场景下,
<param name="movie" value="demo.swf">是必需的,缺了它 Flash Player 甚至不启动 - 如果用 JS 动态插入
<param>,得用appendChild(),不能只设innerHTML—— 后者可能触发 HTML 实体解析异常
flashvars 参数怎么写才不被截断?
Flash Player 把 flashvars 当作查询字符串解析,所以 value 中的 & 必须写成实体 &,否则 HTML 解析器会在 & 处提前截断属性值。
- 正确:
<param name="flashvars" value="uid=123&token=abc%3Dxyz&mode=debug"> - 错误:
<param name="flashvars" value="uid=123&token=abc%3Dxyz">(&未转义,后续参数丢失) - 中文或特殊字符必须先用
encodeURIComponent()编码,再填入value,例如"name=张三"→"name=%E5%BC%A0%E4%B8%89" - Flash 内通过
root.loaderInfo.parameters读取,得到的是已解码对象,无需再调用decodeURIComponent()
现代浏览器里<param>还有效吗?
基本无效。Chrome 自 v45、Firefox 自 v52 ESR 起彻底移除 NPAPI 支持,Edge 从未支持 —— 这意味着 Flash、Java Applet、Silverlight 等所有依赖 <object> + <param></object> 的插件,在当前主流浏览器中根本加载不了,参数自然无从谈起。
- 控制台可能显示
Failed to load plugin或静默空白,没有明确提示“参数未传” - 仍需兼容旧系统?只能锁定特定浏览器版本(如 Chrome 44),且 macOS Catalina 及更新系统会系统级拦截
- 替代方案不是“修
<param>”,而是迁移:Flash →<video></video>+ JS 控制;Java Applet → WebAssembly;PDF →<iframe src="doc.pdf#view=fitH"></iframe> - 若必须用自定义配置,改用
data-属性 + JS 初始化,或 URL 查询参数(如app.html?theme=dark&lang=zh)
真正容易被忽略的不是语法细节,而是前提判断:先确认目标环境是否还支持 NPAPI —— 如果连插件都加载不了,name 写对了也没意义。











