param 标签不支持直接传对象,value 始终为字符串,需手动 json 序列化与解析;现代推荐使用 data-* 属性、js 直接初始化或 postmessage 传递对象。

param 标签根本不支持传对象
param 的 value 属性永远是字符串,浏览器不会自动解析成对象,也不认 valuetype 或 valueType 这类属性——它们早已被 HTML5 废弃,写上去等于白写。你看到的 value="{id:1,name:'test'}",JS 拿到的就是一串原始字符,不是对象。
想传对象?只能手动序列化 + 解析
如果非要用 param(比如配合旧式 object 嵌入自定义 WASM 模块),必须自己处理序列化:
- HTML 中写
<param name="config" value='{"timeout":5000,"debug":true}'>—— 注意用单引号包裹整个 value,避免双引号冲突 - JS 里读取后必须显式调用
JSON.parse(),且要包try/catch,否则 JSON 格式错(比如多写了逗号、用了中文引号)会直接报错中断 - value 里的换行、缩进会被 HTML 解析器自动折叠,所以别写多行 JSON;含空格或
&的值必须先encodeURIComponent()再塞进去
现代项目里,data-* + dataset 是更靠谱的选择
硬啃 param 本质是在把 HTML 当配置文件用,难调试、无类型、不支持嵌套结构。实际开发中更推荐:
- 用
<div id="chart" data-config='{"api":"/v1/data","size":"large"}'></div>,然后 JS 读element.dataset.config再JSON.parse() - 初始化时直接 JS 调用:
Chart.init({ api: '/v1/data', size: 'large' }),彻底绕过 HTML 解析环节 - 如果是 iframe 嵌入,用
postMessage()发送对象,接收方直接拿到原生对象,不用序列化/反序列化
容易被忽略的坑:空对象怎么传
传空对象 {} 看似简单,但容易栽在细节上:
-
data-config="{}"是安全的,JSON.parse(element.dataset.config)能正确得到空对象 - 千万别写
onclick="render({})"在内联事件里——看似能用,但一旦对象里有属性名含引号或特殊字符,HTML 解析就崩;而且无法做类型校验或默认值 fallback - 如果用 URL 参数传空对象,
?config={}是非法的,应改用sessionStorage.setItem('config', JSON.stringify({}))跳转后读取
现在还依赖 param 传对象,基本意味着你在维护一段无法被 Chrome 88+、Firefox 84+ 正常执行的代码——NPAPI 已死,参数机制也跟着失效了。真正可控的“对象传递”,只发生在 JS 运行时,不在 HTML 标签里。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











