<param> 的 value 属性只能传字符串,JS 对象需由 JS 主动读取并用 JSON.parse() 转换后传给 <object> 实例;错误 JSON 格式会导致解析失败,现代方案更推荐直接 JS 初始化或使用 data-* 属性。

param 的 value 属性只能传字符串,不能直接传 JS 对象
这是最常被误解的一点:<param> 是 HTML 标签,它本身不执行 JavaScript,value 属性值在 DOM 解析时就固定为字符串。哪怕你写 <param name="config" value="{a:1,b:2}">,浏览器也只当它是普通文本,Object 不会自动解析。
想让 <object> 拿到结构化数据,得靠 JS 主动读取并转换
<object> 加载后,它的内部插件(比如 Flash 旧方案、或现代 WebAssembly 模块)通常通过脚本接口接收参数。HTML 的 <param> 只是“声明式入口”,真正传递逻辑要靠 JS 处理:
- 用
document.querySelector('param[name="data"]').value拿到原始字符串 - 若内容是 JSON 格式(如
value='{"user":"admin","timeout":5000}'),用JSON.parse()转成对象 - 再调用
<object>实例的公开方法(如plugin.init(config))传入该对象 - 注意:不是所有
<object>实现都支持 JS API —— 这取决于嵌入的具体插件或模块是否暴露接口
常见错误:把 JSON 字符串写错格式导致 JSON.parse() 报错
比如 value='{user: "admin"}' 缺少双引号包裹 key,或用了单引号、换行、注释——这些都会让 JSON.parse() 直接抛 SyntaxError。安全做法:
- 服务端生成时用
JSON.stringify()输出,确保合法 - 前端硬编码时,用双引号、无注释、无尾逗号:
value='{"mode":"dev","retry":3}' - 加 try/catch 包裹解析逻辑,避免因 param 内容异常阻塞后续流程
现代替代方案更推荐用 <iframe> 或直接 JS 初始化
如果目标是向嵌入内容传对象,<object> + <param> 这套机制老旧、兼容性差、调试困难。实际项目中:
立即学习“前端免费学习笔记(深入)”;
- WebAssembly 模块优先用
WebAssembly.instantiateStreaming()+ JS 对象参数 - 第三方 SDK(如地图、播放器)基本都提供 JS 初始化函数,直接传 config 对象
- 需要 HTML 声明式配置时,改用自定义 data 属性:
<div id="player" data-config='{"src":"video.mp4"}'></div>,再由 JS 读取解析
真正难的不是怎么写 value,而是确认你用的插件是否真的通过 <param> 接收参数——很多文档没写清楚,得翻源码或试运行看它有没有监听 getParam() 类方法。



















