非标准属性必须用 getAttribute() 访问,.属性名方式读不到;data-* 属性与普通非标准属性读取方式相同,均不自动映射到 DOM 对象属性;设置需用 setAttribute(),表单提交不包含非标准属性值。

非标准属性不能用 .属性名 直接访问,必须用 getAttribute();否则返回 undefined 或原生默认值,不是你存进去的值。
为什么 input.busCode 读不到自定义属性?
浏览器只把原生属性(如 value、disabled、name)映射为 DOM 对象的可读写属性。所有以 data- 开头或任意非标准名(如 busCode、apiVersion)的属性,都不会自动挂载到元素实例上。
- 错误写法:
const code = input.busCode→ 永远是undefined - 正确写法:
const code = input.getAttribute('busCode') - 若属性不存在,
getAttribute()返回null,不是undefined,建议用??安全兜底
data-* 属性和普通非标准属性读取方式一样吗?
一样。虽然 data- 是 HTML5 明确允许的自定义属性命名规范,但 DOM 层面它仍是“非标准属性”,不享有特殊访问权限。别被 dataset 迷惑——它只是语法糖,底层仍走 getAttribute()。
-
input.dataset.busCode等价于input.getAttribute('data-busCode'),注意连字符转驼峰 - 但
input.getAttribute('busCode')和input.getAttribute('data-busCode')是两个完全不同的属性,互不影响 - 如果同时写了
busCode="123"和data-busCode="456",它们是独立存在的,必须分别读取
设置和修改非标准属性时要注意什么?
用 setAttribute() 设置,不要直接赋值给对象属性(比如 input.busCode = 'abc'),后者不会反映在 HTML 中,也无法被 getAttribute() 读到,且可能在后续序列化(如 form.elements 遍历)中丢失。
- 设值:
input.setAttribute('busCode', 'ABC-2026') - 删值:
input.removeAttribute('busCode') - 检查是否存在:
input.hasAttribute('busCode'),比判断getAttribute()返回值更可靠 - 避免用
input.busCode = ...或input['busCode'] = ...,纯属无效操作
表单提交时,非标准属性的值会一起发给后端吗?
不会。只有原生表单相关属性(name + 有效 value)才会被收集进 FormData 或传统表单提交。非标准属性纯粹是前端上下文存储,必须手动提取并拼入请求体。
- 常见错误:以为加了
busCode="xxx"就能自动提交 → 实际后端收不到 - 正确做法:提交前用
getAttribute()取值,再通过FormData.append()或 JSON 字段显式传出去 - 如果想让自定义数据参与表单逻辑,应改用隐藏域:
最易忽略的一点:服务端渲染模板里插的非标准属性(如 busCode="${busCode}"),一旦 JS 动态修改过 DOM,原始属性值就可能失效;读取前务必确认它是你期望的那个时刻的值。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











