无value属性因其仅为语义分组容器,不参与表单提交;规范禁止设置value,浏览器忽略且JS读取为空;需用data-group等绑定至获取分组信息。
本身不携带可提交的值,它只是视觉和语义上的分组容器;真正能被表单提交或通过 JavaScript 获取的,只有 元素的 value 或 text。
没有 value 属性HTML 规范明确禁止给 设置 value。浏览器会忽略该属性,JS 读取 element.value 也始终返回空字符串。它的唯一合法属性是 label(用于显示分组名)和 disabled(禁用整个分组)。
是无效的,不会被解析为数据源new FormData(form) 或 form.serialize())完全跳过
上(例如用 data-group)不能靠 自身取值,但可以通过 DOM 层级关系反查:先获取选中的 ,再用 .parentElement 找到它的 ,读取其 label。
const select = document.querySelector('select');
select.addEventListener('change', () => {
const option = select.selectedOptions[0];
if (!option) return
;
const optgroup = option.parentElement;
const groupLabel = optgroup && optgroup.tagName === 'OPTGROUP'
? optgroup.label
: '(no group)';
console.log('选中值:', option.value);
console.log('所属分组:', groupLabel);
});
option.parentElement 是否真是 —— 顶级 的父元素是
option.parentNode,某些情况下可能是 DocumentFragment(如动态插入)select.selectedOptions 并对每个做同样处理data-* 绑定到
更可靠的做法是把分组语义“下沉”到每个选项,避免依赖 DOM 结构。例如:
内,option.dataset.group 始终可用Array.from(select.selectedOptions).map(o => ({ value: o.value, group: o.dataset.group }))
真正容易被忽略的是:分组的语义价值只存在于渲染和可访问性(如屏幕阅读器会读出 label),它不是数据载体。所有业务逻辑需要的分组标识,必须显式落到 节点上,否则运行时就丢了。