必须嵌套在内且为直接子级,浏览器不识别外部或非直接子级的;name值须严格匹配目标运行时约定,value需url编码,现代浏览器已禁用npapi插件,仅作静态配置容器,需js主动解析。

多个<param>必须嵌套在<object></object>内部
浏览器只认直接子级的<param>,写在<object></object>外面、或者塞进<p></p>或<div>里,参数全丢。常见错误是把<code><param>当独立配置块写在页面顶部,结果插件根本收不到。
正确结构只有这一种:<object type="..." data="..."><param name="a" value="1">
<param name="b" value="2"></object>。多个<param>并列即可,顺序无关,但重复name时以后出现的为准。
name值必须匹配目标运行时约定,不是随便起的
不同嵌入对象对name的要求天差地别:
- Flash(已淘汰):认
movie、flashvars、wmode - Java Applet(已淘汰):认
code、archive、java_arguments - Unity WebGL(现代常见):认
gameName、companyName,不认_PARAM或config - 自定义 WASM 模块:完全依赖 JS 胶水代码读取,比如
document.querySelector('object').querySelectorAll('param'),然后手动解析name/value
传错name等于没传——查文档比试错快得多。别指望“通用参数名”存在。
特殊字符必须 URL 编码,否则截断或解析失败
<param>的value是纯字符串,浏览器不做任何解码处理。如果值含&、=、空格、中文,不编码就会出问题:
-
&会被当成 HTML 实体起始符,导致属性值提前截断 - 未编码的中文在部分旧环境里显示为乱码或空白
- JSON 字符串建议用单引号包裹:
value='{"theme":"dark","timeout":5000}',避免双引号冲突
安全做法:JS 侧用encodeURIComponent()编码后填入value;WASM/JS 初始化逻辑中再用decodeURIComponent()还原。
现代浏览器中<param>基本失效,别依赖它自动注入
Chrome 45+、Firefox 52+、Edge 已彻底禁用 NPAPI 插件(Flash/Java),<object>+<param></object>块会被静默忽略,控制台可能只报Failed to load plugin或直接空白。
即使<object></object>能加载(如 WASM 或自定义 MIME 类型),浏览器也不会自动把<param>喂给实例——这是开发者要补的胶水逻辑:
- 必须用 JS 主动遍历
object.querySelectorAll('param') - 按
name映射到初始化函数的参数(例如instantiateWasmModule({ config: parsedConfig })) - React/Vue/Svelte 等框架中,应直接用 props 或 setup 函数传参,绕过
<object></object>原生机制
真正容易被忽略的是:参数传递这件事,现在99%靠 JS 控制,<param>只是个静态配置容器,不是魔法开关。











