data-*属性仅用于存储字符串数据,不会自动解析JSON或转换类型,使用时需特别注意数据类型转换问题。
data-* 属性不是配置容器,只是字符串载体;它不解析、不校验、不自动转类型,所有结构化数据必须手动处理。
浏览器将 data-config='{"size":"lg","mode":"dark"}' 视为纯文本存储,通过 element.dataset.config 获取的仍是原始字符串,不会自动执行 JSON.parse()。若直接当作对象使用会导致 TypeError: Cannot read property 'size' of undefined 错误。
data-api-url → dataset.apiUrl,但获取的值始终是字符串类型'{"msg":"he"ll)
escape 处理,否则会生成非法 HTMLvalue 是表单元素的语义属性,仅参与表单提交流程,且其值始终会被强制转换为字符串类型。尝试存储对象只会得到 "[object Object]",这与 data-* 属性完全不同。
→ btn.value 获取的是字符串 "{"x":1}",而非对象 比 更加安全可靠value 存储 ID,然后在 JS 中通过查表获取:const users = { "user-123": { id: 123, name: "Alice" } }
类似
的写法在 React 中会被忽略,因为原生 DOM 元素无法识别非标准属性,event.target.airport 始终返回 undefined。
必须显式转换为 data- 属性:
在事件处理中读取:const id = parseInt(event.target.dataset.airportId)(注意 dataset 键名会自动转换为小驼峰)
避免在 dataset 中存储大量字段;优先采用 ID + 外部数据源查表的方式,以减少 DOM 体积和序列化开销
跨页面传递配置?别依赖 data-*,改用 URL 或 storage
data-* 属性仅存在于当前页面的 DOM 树中,页面刷新后就会丢失。如需在目标页面获取配置信息,应该采用持久化存储方案。
短小配置建议通过 URL 传递:location.href = "page.html?theme=dark&lang=zh",使用 new URLSearchParams(location.search) 进行解析
较长的配置或敏感信息建议使用 sessionStorage:sessionStorage.setItem("config", JSON.stringify(obj)),目标页面读取后应立即执行 removeItem
不建议使用 Cookie:存在 4KB 大小限制,且每次请求都会自动携带,可能带来性能和安全风险
使用 data-*属性时最容易被忽视的是其数据类型问题,所有值都会以字符串形式返回,即使是数字也需要手动转换才能进行正确计算。